DependencyObject Klasse

Definition

Stellt ein Objekt dar, das im Abhängigkeitseigenschaftensystem teilnimmt. DependencyObject ist die unmittelbare Basisklasse vieler wichtiger UI-bezogener Klassen, z. B. UIElement, Geometry, FrameworkTemplate, Style und ResourceDictionary. Weitere Informationen dazu, wie DependencyObject Abhängigkeitseigenschaften unterstützt, finden Sie unter Übersicht über Abhängigkeitseigenschaften.

public ref class DependencyObject
/// [Windows.Foundation.Metadata.ContractVersion(Windows.Foundation.UniversalApiContract, 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(Windows.Foundation.UniversalApiContract), 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
Vererbung
Object Platform::Object IInspectable DependencyObject
Abgeleitet
Attribute

Windows-Anforderungen

Gerätefamilie
Windows 10 (eingeführt in 10.0.10240.0)
API contract
Windows.Foundation.UniversalApiContract (eingeführt in v1.0)

Beispiele

In diesem Beispiel wird eine Klasse definiert, die von DependencyObject abgeleitet wird, und eine angefügte Eigenschaft zusammen mit dem Bezeichnerfeld definiert. Das Szenario für diese Klasse besteht darin, dass es sich um eine Dienstklasse handelt, die eine angefügte Eigenschaft deklariert, die andere UI-Elemente in XAML festlegen können. Der Dienst wirkt potenziell zur Laufzeit auf die angefügten Eigenschaftswerte für diese UI-Elemente.

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 Class AquariumServices
    Inherits DependencyObject
    Public Enum Buoyancy
        Floats
        Sinks
        Drifts
    End Enum

    Public Shared ReadOnly BuoyancyProperty As DependencyProperty = _
          DependencyProperty.RegisterAttached(
          "Buoyancy", _
          GetType(Buoyancy), _
          GetType(AquariumServices), _
          New PropertyMetadata(Buoyancy.Floats))


    Public Sub SetBuoyancy(element As DependencyObject, value As Buoyancy)
        element.SetValue(BuoyancyProperty, value)
    End Sub
    Public Function GetBuoyancy(element As DependencyObject) As Buoyancy
        GetBuoyancy = CType(element.GetValue(BuoyancyProperty), Buoyancy)
    End Function
End Class
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;
    }
}
Public Shared Function ClearSetProperty(targetObject As DependencyObject, targetDP As DependencyProperty) As Boolean
    If targetObject Is Nothing Or targetDP Is Nothing Then
        Throw New ArgumentNullException()
    End If
    Dim localValue As Object = targetObject.ReadLocalValue(targetDP)
    If localValue = DependencyProperty.UnsetValue Then
        ClearSetProperty = False
    Else
        targetObject.ClearValue(targetDP)
        ClearSetProperty = True
    End If
End Function

Dieses Beispiel zeigt eine einfache Abhängigkeitseigenschaftsdeklaration. Ein Aufruf von GetValue stellt die gesamte Get-Accessorimplementierung für den Eigenschaften wrapper der neuen Abhängigkeitseigenschaft dar. Ein Aufruf von SetValue stellt die gesamte Set-Accessorimplementierung dar. Weitere Beispiele finden Sie unter Benutzerdefinierte Abhängigkeitseigenschaften.

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); }
    }
}
Public Class Fish
    Inherits Control

    Public Shared ReadOnly SpeciesProperty As DependencyProperty = _
    DependencyProperty.Register(
    "Species", _
    GetType(String), _
    GetType(Fish), _
    Nothing)
    Public Property Species As String
        Get
            Species = CType(GetValue(SpeciesProperty), String)
        End Get
        Set(value As String)
            SetValue(SpeciesProperty, value)
        End Set
    End Property
End Class

Hinweise

Die DependencyObject-Klasse aktiviert Abhängigkeitseigenschaftensystemdienste für die vielen abgeleiteten Klassen. Weitere Informationen zum Konzept der Abhängigkeitseigenschaft finden Sie unter Übersicht über Abhängigkeitseigenschaften.

Die primäre Funktion des Abhängigkeitseigenschaftssystems besteht darin, die Werte von Eigenschaften zu berechnen und Systembenachrichtigungen über Werte bereitzustellen, die sich geändert haben. Eine weitere Schlüsselklasse, die am Abhängigkeitseigenschaftensystem teilnimmt, ist DependencyProperty. DependencyProperty ermöglicht die Registrierung von Abhängigkeitseigenschaften im Eigenschaftensystem, während DependencyObject als Basisklasse es Objekten ermöglicht, die Abhängigkeitseigenschaften zu verwenden und festzulegen.

Im Folgenden finden Sie einige wichtige Dienste und Merkmale, die DependencyObject bereitstellt oder unterstützt:

  • Abhängigkeitseigenschaften, die die unterstützung für die vorhandenen Windows-Runtime Abhängigkeitseigenschaften hosten.
  • Unterstützung für das Hosting benutzerdefinierter Abhängigkeitseigenschaften. Sie registrieren eine Abhängigkeitseigenschaft, indem Sie die Register-Methode aufrufen und den Rückgabewert der Methode als öffentliche statische Eigenschaft in Ihrer DependencyObject-Klasse speichern.
  • Die angefügte Eigenschaft hostet Unterstützung für die vorhandenen Windows-Runtime angefügten Eigenschaften.
  • Unterstützung für das Hosting von benutzerdefinierten angefügten Eigenschaften. Sie registrieren eine Abhängigkeitseigenschaft für die Verwendung angefügter Eigenschaften, indem Sie die RegisterAttached-Methode aufrufen und den Rückgabewert der Methode als öffentliche statische Eigenschaft in Ihrer Klasse speichern.
  • Abrufen und Festlegen der Hilfsprogrammmethoden für Werte beliebiger Abhängigkeitseigenschaften, die für ein DependencyObject vorhanden sind. Sie verwenden diese beim Definieren von "Wrappern" für benutzerdefinierte Abhängigkeitseigenschaften und können sie auch aus App-Code als Alternative zur Verwendung vorhandener Wrappereigenschaften verwenden.
  • Hilfsprogramm für erweiterte Szenarien zum Untersuchen von Metadaten oder Eigenschaftswerten (z. B . GetAnimationBaseValue).
  • Erzwingung der Threadaffinität zum Standard UI-Thread des Windows-Runtime für alle DependencyObject-Instanzen.
  • Die Dispatcher-Eigenschaft für erweiterte Threadingszenarien. Das Abrufen des Dispatcher-Werts stellt einen Verweis auf ein CoreDispatcher-Objekt bereit. Mit coreDispatcher kann ein Workerthread Code ausführen, der ein DependencyObject verwendet, sich aber nicht im UI-Thread befindet, da coreDispatcher die Ausführung auf einen asynchronen Vorgang zurückstellen kann, der den UI-Thread nicht blockiert oder anderweitig beeinträchtigt. Weitere Informationen finden Sie weiter unten im Abschnitt "DependencyObject und Threading".
  • Grundlegende Datenbindungs- und Formatierungsunterstützung, indem Eigenschaften als Ausdrücke festgelegt werden können, die zu einem späteren Zeitpunkt in der Lebensdauer eines Objekts ausgewertet werden sollen. Diese Konzepte werden in der Übersicht über Abhängigkeitseigenschaften ausführlicher erläutert. Weitere Informationen finden Sie unter Datenbindung im Detail.

DependencyObject und Threading

Alle DependencyObject-Instanzen müssen im UI-Thread erstellt werden, der dem aktuellen Fenster für eine App zugeordnet ist. Dies wird vom System erzwungen, und dies hat zwei wichtige Auswirkungen auf Ihren Code:

  • Code, der die API aus zwei DependencyObject-Instanzen verwendet, wird immer im selben Thread ausgeführt, bei dem es sich immer um den UI-Thread handelt. In diesem Szenario treten in der Regel keine Threadingprobleme auf.
  • Code, der nicht im Standard UI-Thread ausgeführt wird, kann nicht direkt auf ein DependencyObject zugreifen, da ein DependencyObject nur Threadaffinität mit dem UI-Thread aufweist. Nur Code, der im UI-Thread ausgeführt wird, kann den Wert einer Abhängigkeitseigenschaft ändern oder sogar lesen. Beispielsweise kann ein Workerthread, den Sie mit einem . NET-Task oder einem expliziten ThreadPool-Thread initiiert haben, keine Abhängigkeitseigenschaften lesen oder andere APIs aufrufen.

Die Verwendung eines DependencyObject aus einem Workerthread ist nicht vollständig blockiert. Sie müssen jedoch ein CoreDispatcher-Objekt (den Wert von DependencyObject.Dispatcher) aus einem DependencyObject abrufen, um die absichtliche Trennung zwischen dem App-UI-Thread und allen anderen Threads zu durchlaufen, die auf dem System ausgeführt werden. CoreDispatcher macht die RunAsync-Methode verfügbar. Rufen Sie RunAsync auf, um Ihren erwarteten Code (eine IAsyncAction) auszuführen. Wenn es sich um einfachen Code handelt, können Sie einen Lambdaausdruck verwenden, andernfalls können Sie als Delegaten (DispatchedHandler) implementieren. Das System bestimmt, zu welcher Zeit Ihr Code ausgeführt werden kann. Da DependencyObject.Dispatcher den Zugriff über Threads hinweg ermöglicht, ist DependencyObject.Dispatcher die einzige instance-API von DependencyObject oder einer seiner Unterklassen, auf die von einem Nicht-UI-Thread aus zugegriffen werden kann, ohne eine threadübergreifende Ausnahme zu auslösen. Alle anderen DependencyObject-APIs lösen eine Ausnahme aus, wenn Sie versuchen, sie aus einem Workerthread oder einem anderen Nicht-UI-Thread aufzurufen.

Threadingprobleme können in der Regel im typischen Benutzeroberflächencode vermieden werden. Geräte werden jedoch in der Regel nicht dem UI-Thread zugeordnet. Wenn Sie von einem Gerät abgerufene Informationen verwenden, um die Benutzeroberfläche in Echtzeit zu aktualisieren, müssen Sie häufig einen CoreDispatcher erhalten, damit Sie die Benutzeroberfläche aktualisieren können. Dienste sind ein weiterer Fall, in dem der Code, den Sie für den Zugriff auf den Dienst verwenden, möglicherweise nicht im UI-Thread ausgeführt wird.

Ein Codeszenario, in dem DependencyObject-bezogene Threadingprobleme auftreten können, wenn Sie Ihre eigenen DependencyObject-Typen definieren und versuchen, sie für Datenquellen zu verwenden, oder andere Szenarien, in denen ein DependencyObject nicht notwendigerweise geeignet ist (da das Objekt nicht direkt mit der Benutzeroberfläche verknüpft ist). Beispielsweise können Sie perf-Optimierungen mit Hintergrundthreads oder anderen Arbeitsthreads versuchen, die werte der Objekte vor der Präsentation oder als Reaktion auf ein Gerät, einen Dienst oder eine andere externe Eingabe ändern. Bewerten Sie, ob Sie tatsächlich Abhängigkeitseigenschaften für Ihr Szenario benötigen. möglicherweise sind Standardeigenschaften ausreichend.

Abgeleitete DependencyObject-Klassen

DependencyObject ist die übergeordnete Klasse für mehrere direkt abgeleitete Klassen, die alle grundlegend für das Programmiermodell sind, das Sie für Ihre App und deren XAML-Benutzeroberfläche verwenden. Im Folgenden sind einige der wichtigsten abgeleiteten Klassen aufgeführt:

Konstruktoren

DependencyObject()

Stellt das Initialisierungsverhalten der Basisklasse für von DependencyObject abgeleitete Klassen bereit.

Eigenschaften

Dispatcher

Ruft den CoreDispatcher ab, dem dieses Objekt zugeordnet ist. CoreDispatcher stellt eine Funktion dar, die auf das DependencyObject im UI-Thread zugreifen kann, auch wenn der Code von einem Nicht-UI-Thread initiiert wird.

Methoden

ClearValue(DependencyProperty)

Löscht den lokalen Wert einer Abhängigkeitseigenschaft.

GetAnimationBaseValue(DependencyProperty)

Gibt einen beliebigen Basiswert zurück, der für eine Abhängigkeitseigenschaft festgelegt wurde, was in Fällen gilt, in denen eine Animation nicht aktiv ist.

GetValue(DependencyProperty)

Gibt den aktuellen effektiven Wert einer Abhängigkeitseigenschaft aus einem DependencyObject zurück.

ReadLocalValue(DependencyProperty)

Gibt den lokalen Wert einer Abhängigkeitseigenschaft zurück, wenn ein lokaler Wert festgelegt ist.

RegisterPropertyChangedCallback(DependencyProperty, DependencyPropertyChangedCallback)

Registriert eine Benachrichtigungsfunktion zum Lauschen auf Änderungen an einer bestimmten DependencyProperty für dieses DependencyObject-instance.

SetValue(DependencyProperty, Object)

Legt den lokalen Wert einer Abhängigkeitseigenschaft für ein DependencyObject fest.

UnregisterPropertyChangedCallback(DependencyProperty, Int64)

Bricht eine Änderungsbenachrichtigung ab, die zuvor registriert wurde, indem RegisterPropertyChangedCallback aufgerufen wurde.

Gilt für:

Weitere Informationen