Freigeben über


Übersicht über Abhängigkeitseigenschaften

In diesem Thema wird das Abhängigkeitseigenschaftssystem erläutert, das beim Schreiben einer Windows-Runtime-App mit XAML-Definitionen für die Benutzeroberfläche verfügbar ist.

Was ist eine Abhängigkeitseigenschaft?

Eine Abhängigkeitseigenschaft ist ein spezieller Eigenschaftstyp. Insbesondere handelt es sich um eine Eigenschaft, bei der der Wert der Eigenschaft von einem dedizierten Eigenschaftensystem nachverfolgt und beeinflusst wird, das Teil der Windows-Runtime ist.

Um eine Abhängigkeitseigenschaft zu unterstützen, muss das Objekt, das die Eigenschaft definiert, ein DependencyObject sein (also eine Klasse mit der DependencyObject-Basisklasse irgendwo in der Vererbung). Viele der Typen, die Sie für Ihre UI-Definitionen für eine UWP-App mit XAML verwenden, sind eine DependencyObject-Unterklasse und unterstützen Abhängigkeitseigenschaften. Jeder Typ, der aus einem Windows-Runtime-Namespace stammt, der nicht über "XAML" im Namen verfügt, unterstützt jedoch keine Abhängigkeitseigenschaften; Eigenschaften solcher Typen sind gewöhnliche Eigenschaften, die das Abhängigkeitsverhalten des Eigenschaftensystems nicht aufweisen.

Der Zweck von Abhängigkeitseigenschaften besteht darin, einen systemischen Weg zum Berechnen des Werts einer Eigenschaft basierend auf anderen Eingaben (andere Eigenschaften, Ereignisse und Zustände, die während der Ausführung in Ihrer App auftreten) bereitzustellen. Diese anderen Eingaben können folgendes umfassen:

  • Externe Eingaben wie z. B. Benutzereinstellungen
  • Just-in-Time-Mechanismen zur Ermittlung von Eigenschaften wie Datenbindung, Animationen und Storyboards
  • Vorlagenmuster mit mehrfacher Verwendung, z. B. Ressourcen und Stile
  • Werte, die durch Eltern-Kind-Beziehungen mit anderen Elementen im Objektbaum bekannt sind

Eine Abhängigkeitseigenschaft stellt ein bestimmtes Feature des Programmiermodells zum Definieren einer Windows-Runtime-App mit XAML für die Benutzeroberfläche dar oder unterstützt diese. Zu diesen Funktionen gehören:

  • Datenbindung
  • Styles
  • Storyboardanimationen
  • PropertyChanged-Verhalten; Eine Abhängigkeitseigenschaft kann so implementiert werden, dass sie Rückrufe bereitstellt, die Änderungen an andere Abhängigkeitseigenschaften weitergeben können.
  • Verwenden eines Standardwerts, der aus Eigenschaftsmetadaten stammt
  • Allgemeines Eigenschaftensystem-Hilfsprogramm wie ClearValue und Metadatenabfrage

Abhängigkeitseigenschaften und Windows-Runtime-Eigenschaften

Abhängigkeitseigenschaften erweitern die grundlegenden Funktionen der Windows-Runtime-Eigenschaften, indem ein globaler interner Eigenschaftenspeicher bereitgestellt wird, der alle Abhängigkeitseigenschaften in einer App zur Laufzeit unterstützt. Dies ist eine Alternative zum Standardmuster, bei dem eine Eigenschaft durch ein privates Feld gesichert wird, das in der Eigenschaftsdefinitionsklasse privat ist. Sie können sich diesen internen Eigenschaftenspeicher als einen Satz von Eigenschaftsbezeichnern und Werten vorstellen, die für ein bestimmtes Objekt vorhanden sind (solange es sich um ein DependencyObject handelt). Anstatt anhand des Namens identifiziert zu werden, wird jede Eigenschaft im Speicher durch eine DependencyProperty-Instanz identifiziert. Das Eigenschaftensystem blendet dieses Implementierungsdetail jedoch hauptsächlich aus: Sie können in der Regel auf Abhängigkeitseigenschaften zugreifen, indem Sie einen einfachen Namen (den programmgesteuerten Eigenschaftennamen in der von Ihnen verwendeten Codesprache oder einen Attributnamen beim Schreiben von XAML) verwenden.

Der Basistyp, der die Untermauerungen des Abhängigkeitseigenschaftensystems bereitstellt, ist "DependencyObject". DependencyObject definiert Methoden, die auf die Abhängigkeitseigenschaft zugreifen können, und Instanzen einer abgeleiteten DependencyObject-Klasse unterstützen intern das zuvor erwähnte Eigenschaftenspeicherkonzept.

Hier ist eine Zusammenfassung der Terminologie, die wir in der Dokumentation beim Diskutieren von Abhängigkeitseigenschaften verwenden:

Begriff Description
Abhängigkeitseigenschaft Eine Eigenschaft, die für einen DependencyProperty-Bezeichner vorhanden ist (siehe unten). Normalerweise ist dieser Bezeichner als statisches Element der definierten abgeleiteten DependencyObject-Klasse verfügbar.
Bezeichner der Abhängigkeitseigenschaft Ein konstanter Wert, der die Eigenschaft identifiziert; er ist in der Regel öffentlich und schreibgeschützt.
Eigenschaftenwrapper Die aufrufbaren Implementierungen get und set für eine Windows-Runtime-Eigenschaft. Oder die sprachspezifische Projektion der ursprünglichen Definition. Eine Implementierung des get-Eigenschaftswrappers ruft GetValue auf und übergibt dabei den relevanten Bezeichner der Abhängigkeitseigenschaft.

Der Eigenschaftenwrapper eignet sich nicht nur für Aufrufer, es macht auch die Abhängigkeitseigenschaft für alle Prozesse, Tools oder Projektionen verfügbar, die Windows-Runtime-Definitionen für Eigenschaften verwenden.

Im folgenden Beispiel wird eine benutzerdefinierte Abhängigkeitseigenschaft definiert, die für C# definiert ist, und zeigt die Beziehung des Abhängigkeitseigenschaftsbezeichners zum Eigenschaftenwrapper an.

public static readonly DependencyProperty LabelProperty = DependencyProperty.Register(
  "Label",
  typeof(string),
  typeof(ImageWithLabelControl),
  new PropertyMetadata(null)
);


public string Label
{
    get { return (string)GetValue(LabelProperty); }
    set { SetValue(LabelProperty, value); }
}

Hinweis

Das vorangehende Beispiel ist nicht als komplettes Beispiel für die Erstellung einer benutzerdefinierten Abhängigkeitseigenschaft vorgesehen. Es soll Abhängigkeitseigenschaftenkonzepte für jeden zeigen, der Lernkonzepte über Code bevorzugt. Eine ausführlichere Erläuterung dieses Beispiels finden Sie unter Benutzerdefinierte Abhängigkeitseigenschaften.

Rangfolge der Abhängigkeitseigenschaft

Wenn Sie den Wert einer Abhängigkeitseigenschaft abrufen, erhalten Sie einen Wert, der für diese Eigenschaft über einen der Eingaben bestimmt wurde, die am Windows-Runtime-Eigenschaftensystem teilnehmen. Die Rangfolge der Werte von Abhängigkeitseigenschaften ist vorhanden, sodass das Eigenschaften-System der Windows-Runtime Werte vorhersehbar berechnen kann. Es ist wichtig, dass Sie mit dieser grundlegenden Rangfolge ebenfalls vertraut sind. Andernfalls können Sie sich in einer Situation befinden, in der Sie versuchen, eine Eigenschaft auf einer Ebene der Rangfolge festzulegen, aber etwas anderes (das System, Aufrufer von Drittanbietern, ein Teil Ihres eigenen Codes) legt sie auf einer anderen Ebene fest, und Sie werden frustriert versuchen, herauszufinden, welcher Eigenschaftswert verwendet wird und wo dieser Wert stammt.

Beispielsweise sollen Stile und Vorlagen ein gemeinsamer Ausgangspunkt für die Festlegung von Eigenschaftswerten und damit für das Erscheinungsbild eines Steuerelements sein. Bei einer bestimmten Steuerelementinstanz können Sie den Wert jedoch im Vergleich zum allgemeinen Vorlagenwert ändern, z. B. indem Sie diesem Steuerelement eine andere Hintergrundfarbe oder eine andere Textzeichenfolge als Inhalt zuweisen. Das Windows-Runtime-Eigenschaftensystem berücksichtigt lokale Werte in höherer Rangfolge als werte, die von Stilen und Vorlagen bereitgestellt werden. Dies ermöglicht das Szenario, dass appspezifische Werte die Vorlagen überschreiben, sodass die Steuerelemente für ihre eigene Verwendung in der App-UI nützlich sind.

Rangfolgeliste der Abhängigkeitseigenschaft

Es folgt die endgültige Reihenfolge, die das Eigenschaftensystem beim Zuweisen des Laufzeitwerts für eine Abhängigkeitseigenschaft verwendet. Die höchste Priorität wird zuerst aufgeführt. Ausführlichere Erläuterungen finden Sie direkt nach dieser Liste.

  1. Animierte Werte: Aktive Animationen, Visuelle Zustandsanimationen oder Animationen mit einem HoldEnd-Verhalten . Um einen praktischen Effekt zu haben, muss eine auf eine Eigenschaft angewendete Animation Vorrang vor dem Basiswert (nichtanimiert) haben, auch wenn dieser Wert lokal festgelegt wurde.
  2. Lokaler Wert: Ein lokaler Wert kann durch den Komfort des Eigenschaftenwrappers festgelegt werden, der auch dem Festlegen als Attribut- oder Eigenschaftselement in XAML entspricht, oder durch einen Aufruf der SetValue-Methode mithilfe einer Eigenschaft einer bestimmten Instanz. Wenn Sie einen lokalen Wert mithilfe einer Bindung oder einer statischen Ressource festlegen, wirken diese jeweils in der Rangfolge so, als ob ein lokaler Wert festgelegt wurde, und Bindungen oder Ressourcenverweise werden gelöscht, wenn ein neuer lokaler Wert festgelegt wird.
  3. Vorlageneigenschaften: Ein Element weist diese auf, wenn es als Teil einer Vorlage (aus einer ControlTemplate oder DataTemplate) erstellt wurde.
  4. Stil-Setter: Werte aus einem Setter innerhalb von Stilen aus Seiten- oder Anwendungsressourcen.
  5. Standardwert: Eine Abhängigkeitseigenschaft kann einen Standardwert als Teil der Metadaten aufweisen.

Vorlageneigenschaften

Vorlageneigenschaften als Rangfolgeelement gelten nicht für jede Eigenschaft eines Elements, das Sie direkt im XAML-Seitenmarkup deklarieren. Das Konzept der vorlagenbasierten Eigenschaft ist nur für Objekte vorhanden, die erstellt werden, wenn die Windows-Runtime eine XAML-Vorlage auf ein UI-Element anwendet und damit seine visuellen Elemente definiert.

Alle Eigenschaften, die aus einer Steuerelementvorlage festgelegt werden, weisen Werte irgendeiner Art auf. Diese Werte ähneln fast einem erweiterten Satz von Standardwerten für das Steuerelement und werden häufig werten zugeordnet, die Sie später zurücksetzen können, indem Sie die Eigenschaftswerte direkt festlegen. Daher müssen die Vorlagensatzwerte von einem echten lokalen Wert unterschieden werden, damit jeder neue lokale Wert sie überschreiben kann.

Hinweis

In einigen Fällen kann die Vorlage möglicherweise sogar lokale Werte überschreiben, wenn die Vorlage {TemplateBinding}-Markup-Erweiterungsreferenzen für Eigenschaften, die auf Instanzen einstellbar sein sollten, nicht bereitgestellt wurden. Dies geschieht in der Regel nur, wenn die Eigenschaft wirklich nicht für Instanzen festgelegt werden soll, z. B. wenn sie nur für visuelle Elemente und Vorlagenverhalten und nicht für die beabsichtigte Funktion oder Laufzeitlogik des Steuerelements, das die Vorlage verwendet, relevant ist.

Bindungen und Rangfolge

Bindungsvorgänge haben die entsprechende Priorität für den Bereich, für den sie verwendet werden. Beispielsweise fungiert ein auf einen lokalen Wert angewendetes {Binding} als lokaler Wert, und eine {TemplateBinding}-Markup-Erweiterung für einen Eigenschafts-Setter wird analog zu einem Stilsetter angewendet. Da Bindungen bis zur Laufzeit warten müssen, um Werte aus Datenquellen abzurufen, erstreckt sich der Prozess zum Bestimmen der Eigenschaftswertrangfolge für jede Eigenschaft auch in die Laufzeit.

Nicht nur Bindungen funktionieren mit derselben Rangfolge wie ein lokaler Wert, sie sind tatsächlich ein lokaler Wert, wobei die Bindung der Platzhalter für einen zurückgestellten Wert ist. Wenn Sie eine Bindung für einen Eigenschaftswert eingerichtet haben und während der Laufzeit einen lokalen Wert für diesen festlegen, wird die Bindung vollständig ersetzt. Wenn Sie "SetBinding" aufrufen, um eine Bindung zu definieren, die zur Laufzeit nur vorhanden ist, ersetzen Sie alle lokalen Werte, die Sie möglicherweise in XAML oder durch zuvor ausgeführten Code angewendet haben.

Animierte Storyboards und Basiswert

Storyboard-Animationen wirken nach einem Konzept eines Basiswerts. Der Basiswert ist der Wert, der vom Eigenschaftensystem anhand seines Vorrangs bestimmt wird, aber der letzte Schritt, Animationen zu suchen, wird ausgelassen. Beispielsweise kann ein Basiswert aus der Vorlage eines Steuerelements stammen oder aus dem Festlegen eines lokalen Werts für eine Instanz eines Steuerelements stammen. Auf beide Weise überschreibt das Anwenden einer Animation diesen Basiswert und wendet den animierten Wert so lange an, wie die Animation weiterhin ausgeführt wird.

Bei einer animierten Eigenschaft kann der Basiswert immer noch Auswirkungen auf das Verhalten der Animation haben, wenn diese Animation nicht explizit "Von" und "Bis" angibt, oder wenn die Animation die Eigenschaft bei Abschluss auf den Basiswert zurücksetzt wird. In diesen Fällen wird der Rest der Rangfolge wieder verwendet, sobald eine Animation nicht mehr ausgeführt wird.

Eine Animation, die ein To mit einem HoldEnd-Verhalten angibt, kann jedoch einen lokalen Wert außer Kraft setzen, bis die Animation entfernt wird, selbst wenn sie visuell angehalten zu sein scheint. Konzeptionell ist dies wie eine Animation, die für immer ausgeführt wird, auch wenn keine visuelle Animation in der Benutzeroberfläche vorhanden ist.

Mehrere Animationen können auf eine einzelne Eigenschaft angewendet werden. Jede dieser Animationen wurde möglicherweise definiert, um Basiswerte zu ersetzen, die aus verschiedenen Punkten in der Wertrangfolge stammen. Diese Animationen werden jedoch alle gleichzeitig zur Laufzeit ausgeführt, und das bedeutet oft, dass sie ihre Werte kombinieren müssen, da jede Animation einen gleichen Einfluss auf den Wert hat. Dies hängt genau davon ab, wie die Animationen definiert sind und den Typ des Werts, der animiert wird.

Weitere Informationen finden Sie unter Storyboardanimationen.

Standardwerte

Das Einrichten des Standardwerts für eine Abhängigkeitseigenschaft mit einem PropertyMetadata-Wert wird im Thema "Benutzerdefinierte Abhängigkeitseigenschaften " ausführlicher erläutert.

Abhängigkeitseigenschaften weisen weiterhin Standardwerte auf, auch wenn diese Standardwerte in den Metadaten dieser Eigenschaft nicht explizit definiert wurden. Sofern sie nicht durch Metadaten geändert wurden, sind Standardwerte für die Abhängigkeitseigenschaften der Windows-Runtime im Allgemeinen eine der folgenden:

  • Eine Eigenschaft, die ein Laufzeitobjekt verwendet, oder der grundlegende Objekttyp (ein Verweistyp) weist einen Standardwert von NULL auf. Beispielsweise ist DataContextnull , bis er absichtlich festgelegt oder geerbt wird.
  • Eine Eigenschaft, die einen Basiswert wie Zahlen oder einen booleschen Wert (einen Werttyp) verwendet, verwendet einen erwarteten Standardwert für diesen Wert. Beispielsweise "0" für ganze Zahlen und Gleitkommazahlen, "false " für einen booleschen Wert.
  • Eine Eigenschaft, die eine Windows-Runtime-Struktur verwendet, weist einen Standardwert auf, der durch Aufrufen des impliziten Standardkonstruktors dieser Struktur abgerufen wird. Dieser Konstruktor verwendet die Standardwerte für jedes der Grundlegenden Wertfelder der Struktur. Beispielsweise wird ein Standardwert für einen Punktwert mit den X- und Y-Werten als 0 initialisiert.
  • Eine Eigenschaft, die eine Enumeration verwendet, weist einen Standardwert des ersten definierten Elements in dieser Enumeration auf. Überprüfen Sie den Verweis auf bestimmte Enumerationen, um zu sehen, was der Standardwert ist.
  • Eine Eigenschaft, die eine Zeichenfolge verwendet (System.String für .NET, Platform::String für C++/CX) hat einen Standardwert einer leeren Zeichenfolge ("").
  • Sammlungseigenschaften werden in der Regel nicht als Abhängigkeitseigenschaften implementiert, aus Gründen, die weiter in diesem Thema erläutert werden. Wenn Sie jedoch eine benutzerdefinierte Sammlungseigenschaft implementieren und möchten, dass es sich um eine Abhängigkeitseigenschaft handelt, sollten Sie ein unbeabsichtigtes Singleton vermeiden, wie am Ende der benutzerdefinierten Abhängigkeitseigenschaften beschrieben.

Eigenschaftsfunktionalität, die von einer Abhängigkeitseigenschaft bereitgestellt wird

Datenbindung

Eine Abhängigkeitseigenschaft kann ihren Wert festlegen, indem eine Datenbindung angewendet wird. Die Datenbindung verwendet die Syntax der {Binding}-Markuperweiterung in XAML, {x:Bind}-Markuperweiterung oder die Binding-Klasse im Code. Bei einer datengebundenen Eigenschaft wird die endgültige Eigenschaftswertermittlung bis zur Laufzeit zurückgestellt. Zu diesem Zeitpunkt wird der Wert aus einer Datenquelle abgerufen. Die Rolle, die das System der Abhängigkeitseigenschaften hier spielt, besteht darin, ein Platzhalterverhalten für Vorgänge wie das Laden von XAML zu ermöglichen, wenn der Wert noch nicht bekannt ist, und dann den Wert zur Laufzeit durch die Interaktion mit der Windows-Runtime-Datenbindungs-Engine zu liefern.

Im folgenden Beispiel wird der Textwert für ein TextBlock-Element mithilfe einer Bindung in XAML festgelegt. Die Bindung verwendet einen geerbten Datenkontext und eine Objektdatenquelle. (Keine dieser Beispiele wird im gekürzten Beispiel gezeigt. Ein vollständiges Beispiel, das Kontext und Quelle zeigt, finden Sie unter "Datenbindung im Detail".)

<Canvas>
  <TextBlock Text="{Binding Team.TeamName}"/>
</Canvas>

Sie können Bindungen auch mithilfe von Code und nicht mit XAML einrichten. Siehe SetBinding.

Hinweis

Bindungen wie dies werden als lokaler Wert für die Rangfolge von Abhängigkeitseigenschaftswerten behandelt. Wenn Sie einen anderen lokalen Wert für eine Eigenschaft festlegen, die ursprünglich einen Bindungswert enthält, überschreiben Sie die Bindung vollständig, nicht nur den Laufzeitwert der Bindung. {x:Bind} Bindungen werden mithilfe von generiertem Code implementiert, der einen lokalen Wert für die Eigenschaft festgelegt. Wenn Sie einen lokalen Wert für eine Eigenschaft festlegen, die {x:Bind} verwendet, wird dieser Wert beim nächsten Auswerten der Bindung ersetzt, z. B. wenn eine Eigenschaftsänderung für das Quellobjekt beobachtet wird.

Bindungsquellen, Bindungsziele, die Rolle von FrameworkElement

Um die Quelle einer Bindung zu sein, muss eine Eigenschaft keine Abhängigkeitseigenschaft sein. Sie können in der Regel jede Eigenschaft als Bindungsquelle verwenden, obwohl dies von Ihrer Programmiersprache abhängt und für jede Eigenschaft bestimmte Edgefälle vorhanden sind. Um jedoch das Ziel einer {Binding}-Markuperweiterung oder Bindung zu sein, muss diese Eigenschaft eine Abhängigkeitseigenschaft sein. {x:Bind} hat diese Anforderung nicht, da generierter Code verwendet wird, um die Bindungswerte anzuwenden.

Wenn Sie eine Bindung im Code erstellen, beachten Sie, dass die SetBinding-API nur für FrameworkElement definiert ist. Sie können jedoch stattdessen eine Bindungsdefinition mithilfe von BindingOperations erstellen und somit auf eine beliebige DependencyObject-Eigenschaft verweisen.

Denken Sie bei Code oder XAML daran, dass DataContext eine FrameworkElement-Eigenschaft ist. Mithilfe einer Form der Vererbung von übergeordneten und untergeordneten Eigenschaften (typischerweise im XAML-Markup festgelegt) kann das Bindungssystem einen DataContext auflösen, der in einem übergeordneten Element vorhanden ist. Diese Vererbung kann auch dann ausgewertet werden, wenn das untergeordnete Objekt (das die Zieleigenschaft hat) kein FrameworkElement ist und daher keinen eigenen DataContext-Wert enthält. Das übergeordnete Element, das geerbt wird, muss jedoch ein FrameworkElement sein, um den DataContext festzulegen und zu halten. Alternativ müssen Sie die Bindung so definieren, dass sie mit einem Nullwert für DataContext funktionieren kann.

Das Verkabeln der Bindung ist nicht das einzige, was für die meisten Datenbindungsszenarien erforderlich ist. Damit eine unidirektionale oder bidirektionale Bindung wirksam ist, muss die Quelleigenschaft Änderungsbenachrichtigungen unterstützen, die an das Bindungssystem und damit an das Ziel weitergegeben werden. Bei benutzerdefinierten Bindungsquellen bedeutet dies, dass die Eigenschaft eine Abhängigkeitseigenschaft sein muss, oder das Objekt muss INotifyPropertyChanged unterstützen. Sammlungen sollten INotifyCollectionChanged unterstützen. Bestimmte Klassen unterstützen diese Schnittstellen in ihren Implementierungen, sodass sie als Basisklassen für Datenbindungsszenarien nützlich sind; Ein Beispiel für eine solche Klasse ist ObservableCollection<T>. Weitere Informationen zur Datenbindung und zur Beziehung der Datenbindung zum Eigenschaftensystem finden Sie unter "Datenbindung".

Hinweis

Die hier aufgeführten Typen unterstützen Microsoft .NET-Datenquellen. C++/CX-Datenquellen verwenden unterschiedliche Schnittstellen für Änderungsbenachrichtigungen oder feststellbares Verhalten, siehe Datenbindung im Detail.

Stile und Vorlagen

Stile und Vorlagen sind zwei Szenarien, bei denen Eigenschaften als Abhängigkeitseigenschaften definiert werden. Formatvorlagen eignen sich zum Festlegen von Eigenschaften, die die Benutzeroberfläche der App definieren. Formatvorlagen werden als Ressourcen in XAML definiert, entweder als Eintrag in einer Resources-Sammlung oder in separaten XAML-Dateien wie Theme-Ressourcendateien. Stile interagieren mit dem Eigenschaftensystem, da sie Setter für Eigenschaften enthalten. Die wichtigste Eigenschaft hier ist die Control.Template-Eigenschaft eines Steuerelements: Sie definiert den größten Teil der visuellen Darstellung und des visuellen Zustands für ein Steuerelement. Weitere Informationen zu Stilen und xaml-Beispielen, die eine Formatvorlage definieren und Setter verwenden, finden Sie unter Formatieren von Steuerelementen.

Werte, die aus Formatierungen oder Vorlagen stammen, sind verzögerte Werte, ähnlich wie Verknüpfungen. Dies ist so, dass Benutzer Steuerelemente neu erstellen oder Formatvorlagen neu definieren können. Aus diesem Grund können Eigenschaftssetter in Formatvorlagen nur auf Abhängigkeitseigenschaften und nicht auf gewöhnliche Eigenschaften reagieren.

Storyboardanimationen

Sie können den Wert einer Abhängigkeitseigenschaft mithilfe einer Storyboardanimation animieren. Storyboardanimationen in der Windows-Runtime sind nicht nur visuelle Dekorationen. Es ist nützlicher, Animationen als Zustandsautomattechnik zu betrachten, die die Werte einzelner Eigenschaften oder aller Eigenschaften und visuellen Elemente eines Steuerelements festlegen und diese Werte im Laufe der Zeit ändern kann.

Um animiert zu werden, muss die Zieleigenschaft der Animation eine Abhängigkeitseigenschaft sein. Der Werttyp der Zieleigenschaft muss von einem der bestehenden von Zeitachsen abgeleiteten Animationstypen unterstützt werden, um animiert zu werden. Werte von Farbe, Double und Point können mithilfe von Interpolation oder Keyframetechnik animiert werden. Die meisten anderen Werte können mithilfe diskreter Object-Keyframes animiert werden.

Wenn eine Animation angewendet und ausgeführt wird, wird der animierte Wert mit einer höheren Rangfolge als jeder Wert (z. B. ein lokaler Wert) ausgeführt, den die Eigenschaft andernfalls aufweist. Animationen weisen außerdem ein optionales HoldEnd-Verhalten auf, das dazu führen kann, dass Animationen auf Eigenschaftswerte angewendet werden, auch wenn die Animation visuell angehalten wird.

Das Zustandsautomatprinzip wird durch die Verwendung von Storyboardanimationen als Teil des VisualStateManager-Zustandsmodells für Steuerelemente verkörpert. Weitere Informationen zu Storyboardanimationen finden Sie unter Storyboardanimationen. Weitere Informationen zu VisualStateManager und zum Definieren visueller Zustände für Steuerelemente finden Sie unter Storyboardanimationen für visuelle Zustände oder Steuerelementvorlagen.

Eigenschaftsänderungsverhalten

Das Eigenschaftsänderungsverhalten ist der Ursprung des Begriffs "Abhängigkeit" in der Terminologie von Abhängigkeitseigenschaften. Die Aufrechterhaltung gültiger Werte für eine Eigenschaft, wenn eine andere Eigenschaft den Wert der ersten Eigenschaft beeinflussen kann, ist ein schwieriges Entwicklungsproblem in vielen Frameworks. Im Windows-Runtime-Eigenschaftensystem kann jede Abhängigkeitseigenschaft einen Rückruf angeben, der aufgerufen wird, wenn sich der Eigenschaftswert ändert. Dieser Rückruf kann verwendet werden, um verwandte Eigenschaftswerte in der Regel synchron zu benachrichtigen oder zu ändern. Viele vorhandene Abhängigkeitseigenschaften haben ein Verhalten bei Änderungen der Eigenschaften. Sie können auch ähnliche Rückrufmechanismen zu benutzerdefinierten Eigenschaften mit Abhängigkeiten hinzufügen und eigene Rückrufe bei Eigenschaftsänderungen implementieren. Ein Beispiel finden Sie unter benutzerdefinierte Abhängigkeitseigenschaften .

Windows 10 führt die RegisterPropertyChangedCallback-Methode ein. Auf diese Weise kann sich der Anwendungscode für Änderungsbenachrichtigungen registrieren, wenn die angegebene Abhängigkeitseigenschaft in einer Instanz von DependencyObject geändert wird.

Standardwert und ClearValue

Eine Abhängigkeitseigenschaft kann einen Standardwert aufweisen, der als Teil der Eigenschaftsmetadaten definiert ist. Bei einer Abhängigkeitseigenschaft wird der Standardwert nicht irrelevant, nachdem die Eigenschaft zum ersten Mal festgelegt wurde. Der Standardwert kann zur Laufzeit erneut angewendet werden, wenn eine andere Determinante in der Wertrangfolge verschwindet. (Die Rangfolge der Abhängigkeitseigenschaft wird im nächsten Abschnitt erläutert.) Beispielsweise können Sie absichtlich einen Formatvorlagenwert oder eine Animation entfernen, die für eine Eigenschaft gilt, aber Sie möchten, dass der Wert ein vernünftiger Standardwert ist, nachdem Sie dies getan haben. Der Standardwert der Abhängigkeitseigenschaft kann diesen Wert bereitstellen, ohne den Wert der einzelnen Eigenschaften als zusätzlichen Schritt festlegen zu müssen.

Sie können eine Eigenschaft bewusst auf den Standardwert festlegen, auch wenn Sie sie bereits mit einem lokalen Wert festgelegt haben. Rufen Sie die ClearValue-Methode auf, um einen Wert erneut als Standard zurückzusetzen und auch andere Teilnehmer in der Rangfolge zu aktivieren, die möglicherweise den Standardwert außer Kraft setzen, aber keinen lokalen Wert, rufen Sie die ClearValue-Methode auf (verweisen Sie auf die Eigenschaft, die als Methodenparameter gelöscht werden soll). Sie möchten nicht immer, dass die Eigenschaft buchstäblich den Standardwert verwendet, aber das Löschen des lokalen Werts und das Zurücksetzen auf den Standardwert kann ein anderes Element in der Rangfolge aktivieren, das Sie jetzt verwenden möchten, z. B. die Verwendung des Werts, der aus einem Formatsatzer in einer Steuerelementvorlage stammt.

DependencyObject und Threading

Alle DependencyObject-Instanzen müssen im UI-Thread erstellt werden, der dem aktuellen Fenster zugeordnet ist, das von einer Windows-Runtime-App angezeigt wird. Obwohl jedes Abhängigkeitsobjekt im Haupt-UI-Thread erstellt werden muss, können auf die Objekte mithilfe eines Verteilerverweises von anderen Threads zugegriffen werden, indem auf die DispatcherQueue-Eigenschaft zugegriffen wird. Anschließend können Sie Methoden wie TryEnqueue aufrufen und ihren Code innerhalb der Regeln von Threadeinschränkungen für den UI-Thread ausführen.

Hinweis

Greifen Sie für UWP-Apps auf die Dispatcher-Eigenschaft zu. Anschließend können Sie Methoden wie RunAsync für das CoreDispatcher-Objekt aufrufen und den Code innerhalb der Regeln von Threadeinschränkungen im UI-Thread ausführen. Weitere Informationen zu den Unterschieden zwischen UWP und WinUI für das Windows App SDK finden Sie unter Threading-Funktionalitätsmigration.

Die Threadingaspekte von DependencyObject sind relevant, da es im Allgemeinen bedeutet, dass nur Code, der im UI-Thread ausgeführt wird, den Wert einer Abhängigkeitseigenschaft ändern oder sogar lesen kann. Threadingprobleme können in der Regel im typischen UI-Code vermieden werden, der die korrekte Verwendung von asynchronen Mustern und Hintergrundarbeitsthreads ermöglicht. Normalerweise treten nur Probleme mit DependencyObject-bezogenen Threading auf, wenn Sie Ihre eigenen DependencyObject-Typen definieren und versuchen, sie für Datenquellen oder andere Szenarien zu verwenden, in denen ein DependencyObject nicht notwendigerweise geeignet ist.

Konzeptionelles Material