DependencyObject Klasse
Definition
Wichtig
Einige Informationen beziehen sich auf Vorabversionen, die vor dem Release ggf. grundlegend überarbeitet werden. Microsoft übernimmt hinsichtlich der hier bereitgestellten Informationen keine Gewährleistungen, seien sie ausdrücklich oder konkludent.
Stellt ein Objekt dar, das im Abhängigkeitseigenschaftensystem teilnimmt.
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
- Vererbung
- Abgeleitet
- Attribute
Beispiele
In diesem Beispiel wird eine Klasse definiert, die von abgeleitet wird DependencyObject
, und eine angefügte Eigenschaft zusammen mit dem Bezeichnerfeld definiert. Das Szenario für diese Klasse ist, 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 möglicherweise 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 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;
}
}
Dieses Beispiel zeigt eine einfache Abhängigkeitseigenschaftsdeklaration. Ein Aufruf von GetValue stellt die gesamte get
Accessorimplementierung für den Eigenschaftenwrapper der neuen Abhängigkeitseigenschaft dar. Ein Aufruf von SetValue stellt die Gesamte der 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); }
}
}
Hinweise
Die DependencyObject
-Klasse ermöglicht Abhängigkeitseigenschaftensystemdienste für ihre vielen abgeleiteten Klassen und ist die direkte Basisklasse vieler wichtiger UI-bezogener Klassen, z. B. UIElement, Geometry, FrameworkTemplate, Style und ResourceDictionary. Weitere Informationen zur DependencyObject
Unterstützung von Abhängigkeitseigenschaften 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 geänderte Werte bereitzustellen. Eine weitere Schlüsselklasse, die am Abhängigkeitseigenschaftensystem beteiligt ist, ist DependencyProperty.
DependencyProperty ermöglicht die Registrierung von Abhängigkeitseigenschaften im Eigenschaftensystem, während DependencyObject
objekte als Basisklasse die Abhängigkeitseigenschaften verwenden und festlegen können.
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.
-
Get
undSet
Hilfsprogrammmethoden für Werte beliebiger Abhängigkeitseigenschaften, die in einemDependencyObject
vorhanden sind. Sie verwenden diese beim Definieren benutzerdefinierter Abhängigkeitseigenschaftenwrapper 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 für den Standard UI-Thread des Windows-Runtime für alle
DependencyObject
Instanzen. - Die DispatcherQueue-Eigenschaft für erweiterte Threadingszenarien. Ermöglicht
DispatcherQueue
einem Workerthread die Ausführung von Code, der einenDependencyObject
verwendet, sich aber nicht im UI-Thread befindet, da die Ausführung auf einen asynchronen Vorgang zurückversetzt werden 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 eine
DependencyObject
zugreifen, da nur eineDependencyObject
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 DispatcherQueue-Objekt (den Wert von DependencyObject.DispatcherQueue) aus einem DependencyObject
abrufen, um die absichtliche Trennung zwischen dem App-UI-Thread und allen anderen Threads, die auf dem System ausgeführt werden, zu überstehen. Macht DispatcherQueue
die TryEnqueue-Methode verfügbar, um Den erwarteten Code auszuführen. Da es den Zugriff über Threads hinweg ermöglicht, DependencyObject.DispatcherQueue
ist es die einzige instance-API von DependencyObject
oder einer ihrer 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 eine DispatcherQueue
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 probleme beim Threading auftreten DependencyObject
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 sofort 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:
- UIElement: Die Basisklasse für die meisten visuellen Objekte, die Eingaben in der Benutzeroberfläche verarbeiten können. FrameworkElement befindet sich weiter in dieser Hierarchie, ebenso wie Control. Daher gibt es Hunderte von Steuerelementen und anderen Klassen im Windows-Runtime, die alle die UIElement-Klasse in ihren Klassenhierarchien haben.
- Unterstützungsklassen des XAML-Stilsystems: FrameworkTemplate (übergeordnetes Element von ControlTemplate, DataTemplate, ItemsPanelTemplate), Style, SetterBase (übergeordnetes Element von Setter), ToolTipTemplateSettings und andere TemplateSettings.
- Visuelles Zustandsmodell: Transition, VisualState, VisualStateGroup, VisualStateManager, VisualTransition.
- Datenbindungsunterstützung: BindingBase (übergeordnetes Element von Binding), CollectionViewSource, PropertyPath, RelativeSource.
- Storyboardanimationen: Zeitachse (übergeordnetes Element von Storyboard, typisierte Animationen, Designanimationen), typisierte Keyframes (z . B. ColorKeyFrame), KeySpline, EasingFunctionBase.
- XAML-Grafiken und Renderinggrundtypen: Brush, Geometry, GeneralTransform, GradientStop, PathFigure, PathSegment, Projection.
- Bild- und Renderoberflächeninterop: ImageSource (übergeordnetes Element von BitmapSource, RenderTargetBitmap, SurfaceImageSource und anderen).
- Fenster: Stellt das Standard App-Fenster dar.
- FlyoutBase (übergeordnetes Element von Flyout und MenuFlyout).
- ResourceDictionary: Definiert schlüsselierte Ressourcen in XAML.
- TextElement: Übergeordnetes Element von Block und Inline. Diese wiederum sind Basisklassen für Textelemente, die für TextBlock-Inhalte oder die Rich-Text-Elemente verwendet werden.
- AutomationPeer: Basisklasse für Microsoft Benutzeroberflächenautomatisierung Peers, die XAML-Steuerelemente für einen Microsoft Benutzeroberflächenautomatisierung-Listener darstellen. Außerdem IRawElementProviderSimple.
- Sonstiges: CacheMode, ColumnDefinition, DependencyObjectCollection, InputScope, InputScopeName, PageStackEntry, PrintDocument, RowDefinition, TriggerAction, TriggerBase.
Konstruktoren
DependencyObject() |
Stellt das Initialisierungsverhalten der Basisklasse für abgeleitete DependencyObject-Klassen bereit. |
Eigenschaften
Dispatcher |
Gibt immer in einer Windows App SDK-App zurück |
DispatcherQueue |
Ruft den |
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 eingerichtet wurde, der 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 durch Aufrufen von RegisterPropertyChangedCallback registriert wurde. |