Übersicht über Abhängigkeitseigenschaften
In diesem Thema wird das Abhängigkeitseigenschaftssystem erläutert, das verfügbar ist, wenn Sie eine Windows-Runtime App mit C++, C# oder Visual Basic zusammen mit XAML-Definitionen für die Benutzeroberfläche schreiben.
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 dieser Typen sind gewöhnliche Eigenschaften, die nicht über das Abhängigkeitsverhalten des Eigenschaftensystems verfügen.
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 Beziehungen zwischen übergeordneten und untergeordneten Elementen und anderen Elementen in der Objektstruktur bekannt sind
Eine Abhängigkeitseigenschaft stellt ein bestimmtes Feature des Programmiermodells zum Definieren einer Windows-Runtime App mit XAML für UI- und C#-, Microsoft Visual Basic- oder Visual C++-Komponentenerweiterungen (C++/CX) für Code dar oder unterstützt diese. Diese Funktionen umfassen Folgendes:
- Datenbindung
- Stile
- Storyboardanimationen
- Verhalten "PropertyChanged"; Eine Abhängigkeitseigenschaft kann implementiert werden, um Rückrufe bereitzustellen, die Änderungen an andere Abhängigkeitseigenschaften weitergeben können.
- Verwenden eines Standardwerts, der aus Eigenschaftsmetadaten stammt
- Allgemeines Eigenschaftensystemprogramm wie ClearValue und Metadatensuche
Abhängigkeitseigenschaften und Windows-Runtime Eigenschaften
Abhängigkeitseigenschaften erweitern grundlegende Windows-Runtime Eigenschaftenfunktionen, indem ein globaler interner Eigenschaftenspeicher bereitgestellt wird, der alle Abhängigkeitseigenschaften in einer App zur Laufzeit zurückgibt. Dies ist eine Alternative zum Standardmuster der Sicherung einer Eigenschaft mit einem privaten Feld, 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 | Beschreibung |
---|---|
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. |
Abhängigkeitseigenschaftsbezeichner | Ein konstanter Wert, um die Eigenschaft zu identifizieren, ist sie in der Regel öffentlich und schreibgeschützt. |
Eigenschaftenwrapper | Die aufrufbaren Get- und Set-Implementierungen für eine Windows-Runtime-Eigenschaft. Oder die sprachspezifische Projektion der ursprünglichen Definition. Eine Get-Eigenschaftswrapperimplementierung ruft GetValue auf, wobei der relevante Bezeichner der Abhängigkeitseigenschaft übergeben wird. |
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 vollständiges Beispiel zum Erstellen 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.
Priorität von Abhängigkeitseigenschaftswerten
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 Abhängigkeitseigenschaft ist vorhanden, damit das Windows-Runtime Eigenschaftensystem Werte vorhersehbar berechnen kann, und es ist wichtig, dass Sie auch mit der grundlegenden Rangfolge 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 Erstellung von Eigenschaftswerten und damit darstellungen 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 für Abhängigkeitseigenschaften
Es folgt die endgültige Reihenfolge, die das Eigenschaftensystem beim Zuweisen des Laufzeitwerts für eine Abhängigkeitseigenschaft verwendet. Die oberste Priorität ist zuerst aufgeführt. Ausführlichere Erläuterungen finden Sie in dieser Liste.
- 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.
- 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.
- Vorlageneigenschaften: Ein Element weist diese auf, wenn es als Teil einer Vorlage (aus einer ControlTemplate oder DataTemplate) erstellt wurde.
- Formatvorlagensetter: Werte aus einem Setter innerhalb von Formatvorlagen von Seiten- oder Anwendungsressourcen.
- 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 überschreibt die Vorlage möglicherweise sogar lokale Werte, wenn die Vorlage {TemplateBinding}-Markuperweiterungsverweise für Eigenschaften, die für Instanzen festgelegt werden sollten, nicht verfügbar gemacht werden konnte. 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}-Markuperweiterung für einen Eigenschaftssatz wird als 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 zur Laufzeit einen lokalen Wert dafür 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.
Storyboardanimationen und Basiswert
Storyboardanimationen wirken auf ein Konzept eines Basiswerts. Der Basiswert ist der Wert, der vom Eigenschaftensystem anhand seiner Rangfolge bestimmt wird, aber diesen letzten Schritt der Suche nach Animationen weglassen. 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 trotzdem auswirkungen auf das Verhalten der Animation haben, wenn diese Animation nicht explizit " Von" und "In" angibt, oder wenn die Animation die Eigenschaft bei Abschluss auf den Basiswert zurückgesetzt. In diesen Fällen wird der Rest der Rangfolge wieder verwendet, sobald eine Animation nicht mehr ausgeführt wird.
Eine Animation, die ein "An" mit einem HoldEnd-Verhalten angibt, kann jedoch einen lokalen Wert außer Kraft setzen, bis die Animation entfernt wird, auch wenn sie visuell angehalten wird. 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 davon ab, wie die Animationen genau definiert sind, sowie vom 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 Windows-Runtime Abhängigkeitseigenschaften 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 DataContext null, 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.
Von einer Abhängigkeitseigenschaft bereitgestellte Eigenschaftenfunktionalität
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 Abhängigkeitseigenschaftssystem hier spielt, ist das Aktivieren eines Platzhalterverhaltens für Vorgänge wie das Laden von XAML, wenn der Wert noch nicht bekannt ist, und dann den Wert zur Laufzeit durch Interaktion mit dem Windows-Runtime Datenbindungsmodul bereitstellen.
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, in dem Kontext und Quelle angezeigt werden, 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 übergeordneter untergeordneter Eigenschaften (in der Regel 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
Formatvorlagen und Vorlagen sind zwei der Szenarien für Eigenschaften, die 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-Auflistung oder in separaten XAML-Dateien wie Designressourcenwörterbüchern. 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 Formatvorlagen oder Vorlagen stammen, sind verzögerte Werte, ähnlich wie Bindungen. 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. Außerdem muss der Werttyp der Zieleigenschaft von einem der vorhandenen vom Zeitachsen abgeleiteten Animationstypen unterstützt 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.
Verhalten von Eigenschaftsänderung
Das Verhalten von Eigenschaftsänderung ist der Ursprung des "Abhängigkeits"-Teils 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 weisen ein Verhalten auf, das sich geändert hat. Sie können auch ein ähnliches Rückrufverhalten zu benutzerdefinierten Abhängigkeitseigenschaften hinzufügen und eigene Rückrufe mit Eigenschaftsänderung implementieren. Ein Beispiel finden Sie unter benutzerdefinierte Abhängigkeitseigenschaften .
Windows 10 führt die RegisterPropertyChangedCallback-Methode ein. Auf diese Weise kann 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 aus anderen Threads zugegriffen werden, indem auf die Dispatcher-Eigenschaft zugegriffen wird. 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.
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.
Zugehörige Themen
Konzeptionelles Material
- Benutzerdefinierte Abhängigkeitseigenschaften
- Übersicht über angefügte Eigenschaften
- Datenbindung im Detail
- Storyboardanimationen
- Erstellen von Komponenten für Windows-Runtime
- Beispiel für XAML-Benutzer und benutzerdefinierte Steuerelemente