DependencyObject Classe
Definizione
Importante
Alcune informazioni sono relative alla release non definitiva del prodotto, che potrebbe subire modifiche significative prima della release definitiva. Microsoft non riconosce alcuna garanzia, espressa o implicita, in merito alle informazioni qui fornite.
Rappresenta un oggetto che fa parte del sistema di proprietà di dipendenza.
public ref class DependencyObject
/// [Windows.Foundation.Metadata.ContractVersion(Microsoft.UI.Xaml.WinUIContract, 65536)]
/// [Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.Agile)]
/// [Windows.Foundation.Metadata.Threading(Windows.Foundation.Metadata.ThreadingModel.Both)]
class DependencyObject
[Windows.Foundation.Metadata.ContractVersion(typeof(Microsoft.UI.Xaml.WinUIContract), 65536)]
[Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.Agile)]
[Windows.Foundation.Metadata.Threading(Windows.Foundation.Metadata.ThreadingModel.Both)]
public class DependencyObject
Public Class DependencyObject
- Ereditarietà
- Derivato
- Attributi
Esempio
Questo esempio definisce una classe che deriva da DependencyObject
e definisce una proprietà associata insieme al campo identificatore. Lo scenario per questa classe è che si tratta di una classe di servizio che dichiara una proprietà associata che altri elementi dell'interfaccia utente possono impostare in XAML. Il servizio agisce potenzialmente sui valori delle proprietà associate su tali elementi dell'interfaccia utente in fase di esecuzione.
public abstract class AquariumServices : DependencyObject
{
public enum Buoyancy { Floats, Sinks, Drifts }
public static readonly DependencyProperty BuoyancyProperty = DependencyProperty.RegisterAttached(
"Buoyancy",
typeof(Buoyancy),
typeof(AquariumServices),
new PropertyMetadata(Buoyancy.Floats)
);
public static void SetBuoyancy(DependencyObject element, Buoyancy value)
{
element.SetValue(BuoyancyProperty, value);
}
public static Buoyancy GetBuoyancy(DependencyObject element)
{
return (Buoyancy)element.GetValue(BuoyancyProperty);
}
}
public static bool ClearSetProperty(DependencyObject targetObject, DependencyProperty targetDP)
{
if (targetObject == null || targetDP == null)
{
throw new ArgumentNullException();
}
object localValue = targetObject.ReadLocalValue(targetDP);
if (localValue == DependencyProperty.UnsetValue)
{
return false;
}
else
{
targetObject.ClearValue(targetDP);
return true;
}
}
Questo esempio mostra una semplice dichiarazione di proprietà di dipendenza. Una chiamata a GetValue costituisce l'intera implementazione della get
funzione di accesso per il wrapper di proprietà della nuova proprietà di dipendenza. Una chiamata a SetValue costituisce l'intera implementazione della set
funzione di accesso. Per altri esempi, vedere Proprietà di dipendenza personalizzate.
public class Fish : Control
{
public static readonly DependencyProperty SpeciesProperty =
DependencyProperty.Register(
"Species",
typeof(String),
typeof(Fish), null
);
public string Species
{
get { return (string)GetValue(SpeciesProperty); }
set { SetValue(SpeciesProperty, (string)value); }
}
}
Commenti
La DependencyObject
classe abilita i servizi di sistema delle proprietà di dipendenza nelle numerose classi derivate ed è la classe di base immediata di molte classi importanti correlate all'interfaccia utente, ad esempio UIElement, Geometry, FrameworkTemplate, Style e ResourceDictionary. Per altre info su come DependencyObject
supportare le proprietà di dipendenza, vedi Panoramica delle proprietà di dipendenza.
La funzione primaria del sistema di proprietà di dipendenza consiste nel calcolare i valori delle proprietà e per fornire una notifica di sistema sui valori modificati. Un'altra classe chiave che partecipa al sistema di proprietà di dipendenza è DependencyProperty.
DependencyProperty consente la registrazione delle proprietà di dipendenza nel sistema di proprietà, mentre DependencyObject
come classe di base consente agli oggetti di usare e impostare le proprietà di dipendenza.
Ecco alcuni servizi e caratteristiche rilevanti forniti da DependencyObject o supportati:
- Supporto dell'hosting delle proprietà di dipendenza per le proprietà di dipendenza Windows Runtime esistenti.
- Supporto per l'hosting di proprietà di dipendenza personalizzate. Per registrare una proprietà di dipendenza, chiamare il metodo Register e archiviare il valore restituito del metodo come proprietà statica pubblica nella
DependencyObject
classe. - Supporto dell'hosting delle proprietà associate per le proprietà associate Windows Runtime esistenti.
- Supporto per l'hosting di proprietà associate personalizzate. Per registrare una proprietà di dipendenza per l'utilizzo della proprietà associata, chiamare il metodo RegisterAttached e archiviare il valore restituito del metodo come proprietà statica pubblica nella classe.
-
Get
eSet
metodi di utilità per i valori di qualsiasi proprietà di dipendenza esistente in un oggettoDependencyObject
. Questi vengono usati quando si definiscono wrapper di proprietà di dipendenza personalizzati e possono essere usati anche dal codice dell'app come alternativa all'uso delle proprietà wrapper esistenti. - Utilità dello scenario avanzato per l'analisi dei metadati o dei valori delle proprietà, ad esempio GetAnimationBaseValue.
- Imposizione dell'affinità di thread al thread principale dell'interfaccia utente del Windows Runtime per tutte le
DependencyObject
istanze. - Proprietà DispatcherQueue per scenari di threading avanzati.
DispatcherQueue
Consente a un thread di lavoro di eseguire il codice che usa maDependencyObject
non è presente nel thread dell'interfaccia utente, perché può rinviare l'esecuzione a un'operazione asincrona che non blocca o interferisce altrimenti con il thread dell'interfaccia utente. Vedere la sezione "DependencyObject
e threading" di seguito. - Supporto di data binding e stili di base, abilitando l'impostazione delle proprietà come espressioni da valutare in un secondo momento nella durata di un oggetto. Questi concetti vengono illustrati in modo più dettagliato in Panoramica delle proprietà di dipendenza. Vedere anche Data binding in modo approfondito.
DependencyObject e threading
Tutte le DependencyObject
istanze devono essere create nel thread dell'interfaccia utente associato alla finestra corrente per un'app. Questo viene applicato dal sistema e ci sono due importanti implicazioni di questo per il codice:
- Il codice che usa l'API da due
DependencyObject
istanze verrà sempre eseguito nello stesso thread, che è sempre il thread dell'interfaccia utente. In genere non si verificano problemi di threading in questo scenario. - Il codice che non è in esecuzione nel thread principale dell'interfaccia utente non può accedere direttamente a perché
DependencyObject
haDependencyObject
affinità di thread solo al thread dell'interfaccia utente. Solo il codice eseguito nel thread dell'interfaccia utente può modificare o persino leggere il valore di una proprietà di dipendenza. Ad esempio, un thread di lavoro avviato con un'attività .NET o un thread ThreadPool esplicito non sarà in grado di leggere le proprietà di dipendenza o chiamare altre API.
Non è completamente bloccato l'uso di un DependencyObject
oggetto da un thread di lavoro. È tuttavia necessario ottenere un oggetto DispatcherQueue (il valore di DependencyObject.DispatcherQueue) da un DependencyObject
oggetto per ottenere la separazione intenzionale tra il thread dell'interfaccia utente dell'app e qualsiasi altro thread in esecuzione nel sistema.
DispatcherQueue
espone il metodo TryEnqueue per eseguire il codice awaitable. Poiché abilita l'accesso tra thread, DependencyObject.DispatcherQueue
è l'unica API di istanza di DependencyObject
o una delle relative sottoclassi a cui è possibile accedere da un thread non dell'interfaccia utente senza generare un'eccezione tra thread. Tutte le altre DependencyObject
API generano un'eccezione se si tenta di chiamarle da un thread di lavoro o da qualsiasi altro thread non dell'interfaccia utente.
I problemi di threading possono in genere essere evitati nel codice tipico dell'interfaccia utente. Tuttavia, i dispositivi non sono in genere associati al thread dell'interfaccia utente. Se si usano informazioni ottenute da un dispositivo per aggiornare l'interfaccia utente in tempo reale, spesso è necessario ottenere un oggetto DispatcherQueue
in modo da poter aggiornare l'interfaccia utente. I servizi sono un altro caso in cui il codice usato per accedere al servizio potrebbe non essere in esecuzione nel thread dell'interfaccia utente.
Uno scenario di codice in cui potrebbero verificarsi DependencyObject
problemi di threading correlati se si definiscono i propri DependencyObject
tipi e si tenta di usarli per le origini dati o altri scenari in cui un DependencyObject
non è necessariamente appropriato (perché l'oggetto non è direttamente correlato all'interfaccia utente). Ad esempio, è possibile tentare di ottimizzare le prestazioni con thread in background o altri thread di lavoro che modificano i valori degli oggetti prima della presentazione o in risposta a un dispositivo, un servizio o un altro input esterno. Valutare se sono effettivamente necessarie proprietà di dipendenza per lo scenario in uso; forse le proprietà standard sono adeguate.
Classi derivate dependencyObject
DependencyObject
è la classe padre per diverse classi derivate immediatamente fondamentali per il modello di programmazione usato per l'app e l'interfaccia utente XAML. Ecco alcune delle classi derivate rilevanti:
- UIElement: classe di base per la maggior parte degli oggetti visivi in grado di elaborare l'input nell'interfaccia utente. FrameworkElement è più avanti in questa gerarchia, così come è Control, quindi ci sono centinaia di controlli e altre classi nella Windows Runtime che tutti hanno la classe UIElement nelle gerarchie di classi.
- Classi di supporto del sistema di stile XAML: FrameworkTemplate (padre di ControlTemplate, DataTemplate, ItemsPanelTemplate), Style, SetterBase (padre di Setter), ToolTipTemplateSettings e altri TemplateSettings.
- Modello di stato di visualizzazione: Transition, VisualState, VisualStateGroup, VisualStateManager, VisualTransition.
- Supporto del data binding: BindingBase (padre di Binding), CollectionViewSource, PropertyPath, RelativeSource.
- Animazioni con storyboard: sequenza temporale (padre di Storyboard, animazioni tipate, animazioni a tema), fotogrammi chiave tipizzato (ad esempio ColorKeyFrame), KeySpline, EasingFunctionBase.
- Grafica XAML e primitive di rendering: Brush, Geometry, GeneralTransform, GradientStop, PathFigure, PathSegment, Projection.
- Creazione di immagini e interoperabilità della superficie di rendering: ImageSource (padre di BitmapSource, RenderTargetBitmap, SurfaceImageSource e altri).
- Finestra: rappresenta la finestra principale dell'app.
- FlyoutBase (padre di Riquadro a comparsa e MenuFlyout).
- ResourceDictionary: definisce le risorse con chiave in XAML.
- TextElement: elemento padre di Block e Inline, a sua volta sono classi di base per gli elementi di testo usati per il contenuto TextBlock o gli elementi rtf.
- AutomationPeer: classe di base per i peer di Microsoft Automazione interfaccia utente che rappresentano i controlli XAML a un listener di Microsoft Automazione interfaccia utente. Inoltre, IRawElementProviderSimple.
- Varie: CacheMode, ColumnDefinition, DependencyObjectCollection, InputScope, InputScopeName, PageStackEntry, PrintDocument, RowDefinition, TriggerAction, TriggerBase.
Costruttori
DependencyObject() |
Fornisce il comportamento di inizializzazione della classe di base per le classi derivate DependencyObject . |
Proprietà
Dispatcher |
Restituisce |
DispatcherQueue |
Ottiene l'oggetto |
Metodi
ClearValue(DependencyProperty) |
Cancella il valore locale di una proprietà di dipendenza. |
GetAnimationBaseValue(DependencyProperty) |
Restituisce qualsiasi valore di base stabilito per una proprietà di dipendenza, che si applica nei casi in cui un'animazione non è attiva. |
GetValue(DependencyProperty) |
Restituisce il valore effettivo corrente di una proprietà di dipendenza da un oggetto DependencyObject. |
ReadLocalValue(DependencyProperty) |
Restituisce il valore locale di una proprietà di dipendenza, se viene impostato un valore locale. |
RegisterPropertyChangedCallback(DependencyProperty, DependencyPropertyChangedCallback) |
Registra una funzione di notifica per l'ascolto delle modifiche a un'istanza di DependencyObject specifica. |
SetValue(DependencyProperty, Object) |
Imposta il valore locale di una proprietà di dipendenza in un oggetto DependencyObject. |
UnregisterPropertyChangedCallback(DependencyProperty, Int64) |
Annulla una notifica di modifica registrata in precedenza chiamando RegisterPropertyChangedCallback. |