Condividi tramite


DependencyObject Classe

Definizione

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à
Object Platform::Object IInspectable DependencyObject
Derivato
Attributi

Esempio

Questo esempio definisce una classe che deriva da DependencyObjecte 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 e Set metodi di utilità per i valori di qualsiasi proprietà di dipendenza esistente in un oggetto DependencyObject. 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 ma DependencyObject 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 ha DependencyObject 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 DependencyObjectproblemi 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:

Costruttori

DependencyObject()

Fornisce il comportamento di inizializzazione della classe di base per le classi derivate DependencyObject .

Proprietà

Dispatcher

Restituisce null sempre in un'app SDK per app di Windows. Usare invece DispatcherQueue .

DispatcherQueue

Ottiene l'oggetto DispatcherQueue associato. Rappresenta DispatcherQueue una struttura che può accedere al thread dell'interfaccia utente anche se il codice viene avviato da un thread non dell'interfaccia DependencyObject utente.

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.

Si applica a

Vedi anche