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. DependencyObject ist die direkte Basisklasse vieler wichtiger UI-verwandter 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
- 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 möglicherweise auf die angefügten Eigenschaftswerte auf diesen UI-Elementen zur Laufzeit.
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
In diesem Beispiel wird eine einfache Abhängigkeitseigenschaftsdeklaration gezeigt. Ein Aufruf von GetValue stellt die gesamte Implementierung des Get Accessor für den Eigenschaftenumbruch der neuen Abhängigkeitseigenschaft dar. Ein Aufruf von SetValue stellt die Gesamte der Set-Accessor-Implementierung 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 ermöglicht Die Abhängigkeitseigenschaftssystemdienste für ihre vielen abgeleiteten Klassen. Weitere Informationen zum Abhängigkeitseigenschaftskonzept 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 geändert wurden. Eine andere Schlüsselklasse, die an dem Abhängigkeitseigenschaftssystem teilnimmt, ist DependencyProperty. DependencyProperty ermöglicht die Registrierung von Abhängigkeitseigenschaften im Eigenschaftensystem, während DependencyObject als Basisklasse die Verwendung und Festlegung der Abhängigkeitseigenschaften ermöglicht.
Nachfolgend finden Sie einige wichtige Dienste und Merkmale, die DependencyObject bereitstellt oder unterstützt:
- Unterstützung der Abhängigkeitseigenschaft für die vorhandenen Windows 运行时 Abhängigkeitseigenschaften.
- Unterstützung für benutzerdefinierte Abhängigkeitseigenschaft. 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.
- Angefügte Eigenschaftshostingunterstützung für die vorhandenen Windows 运行时 angefügten Eigenschaften.
- Unterstützung für benutzerdefinierte angefügte 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.
- Dient zum Abrufen und Festlegen von Hilfsprogrammmethoden für Werte aller Abhängigkeitseigenschaften, die in einem Abhängigkeitsobjekt vorhanden sind. Sie verwenden diese beim Definieren benutzerdefinierter Abhängigkeitseigenschaft "Wrapper" und können sie auch von App-Code als Alternative zur Verwendung vorhandener "Wrapper"-Eigenschaften verwenden.
- Advanced-Scenario-Hilfsprogramm zum Untersuchen von Metadaten oder Eigenschaftswerten (z. B. GetAnimationBaseValue).
- Erzwingung der Threadaffinität zum Haupt-UI-Thread der Windows 运行时 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 dem CoreDispatcher kann ein Workerthread Code ausführen, der ein DependencyObject verwendet, sich aber nicht im UI-Thread befindet, da der CoreDispatcher die Ausführung auf einen asynchronen Vorgang zurückstellen kann, der den UI-Thread nicht blockiert oder anderweitig beeinträchtigt. Siehe Abschnitt "DependencyObject und Threading" weiter unten.
- 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 ausführlicher in der Übersicht über Abhängigkeitseigenschaften erläutert. Weitere Informationen finden Sie unter "Datenbindung".
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 es gibt zwei wichtige Auswirkungen darauf für Ihren Code:
- Code, der API aus zwei DependencyObject-Instanzen verwendet, wird immer auf demselben Thread ausgeführt, der immer der UI-Thread ist. In diesem Szenario treten in der Regel keine Threadingprobleme auf.
- Code, der nicht im Haupt-UI-Thread ausgeführt wird, kann nicht direkt auf ein DependencyObject zugreifen, da ein DependencyObject die Threadaffinität nur für den 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 einer . NET-Aufgabe oder einem expliziten ThreadPool-Thread initiiert haben, keine Abhängigkeitseigenschaften lesen oder andere APIs aufrufen.
Sie sind nicht vollständig daran gehindert, ein Abhängigkeitsobjekt aus einem Workerthread zu verwenden. Sie müssen jedoch ein CoreDispatcher-Objekt (den Wert von DependencyObject.Dispatcher) aus einem Abhängigkeitsobjekt abrufen, um die bewusste Trennung zwischen dem App-UI-Thread und allen anderen Threads, die auf dem System ausgeführt werden, zu durchlaufen. Der 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 Lambda-Ausdruck verwenden, andernfalls können Sie als Stellvertretung (DispatchedHandler) implementieren. Das System bestimmt eine Zeit, zu der Ihr Code ausgeführt werden kann. Da der Zugriff über Threads hinweg aktiviert wird, ist DependencyObject.Dispatcher die einzige Instanz-API von DependencyObject oder einer seiner Unterklassen, auf die über einen nicht-UI-Thread 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 UI-Code vermieden werden. Geräte sind jedoch in der Regel nicht mit dem UI-Thread verknüpft. Wenn Sie Informationen verwenden, die von einem Gerät abgerufen wurden, 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, diese 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 ändern oder als Reaktion auf ein Gerät, einen Dienst oder eine andere externe Eingabe. Bewerten Sie, ob Sie Abhängigkeitseigenschaften für Ihr Szenario wirklich benötigen; vielleicht sind Standardeigenschaften ausreichend.
Abgeleitete DependencyObject-Klassen
DependencyObject ist die übergeordnete Klasse für mehrere sofort abgeleitete Klassen, die für das Programmiermodell, das Sie für Ihre App und die XAML-Benutzeroberfläche verwenden, grundlegend sind. Hier sind einige der wichtigen abgeleiteten Klassen:
- 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, wie "Control", daher gibt es Hunderte von Steuerelementen und anderen Klassen in der Windows 运行时, 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.
- Unterstützung der Datenbindung: BindingBase (übergeordnetes Element von Binding), CollectionViewSource, PropertyPath, RelativeSource.
- Storyboardanimationen: Zeitachse (übergeordnetes Element von Storyboard, Typanimationen, Designanimationen), eingegebene Keyframes (z. B. ColorKeyFrame), KeySpline, EasingFunctionBase.
- XAML-Grafiken und Renderinggrundtypen: Pinsel, Geometrie, GeneralTransform, GradientStop, PathFigure, PathSegment, Projektion.
- Bild- und Renderoberflächeninterop: ImageSource (übergeordnetes Element von BitmapSource, RenderTargetBitmap, SurfaceImageSource und andere).
- Fenster: stellt das Hauptfenster der App dar.
- FlyoutBase (übergeordnetes Element von Flyout und MenuFlyout).
- ResourceDictionary: definiert schlüsselierte Ressourcen in XAML.
- TextElement: Übergeordnetes Element von Block und Inline sind dies wiederum Basisklassen für Textelemente, die für TextBlock-Inhalte oder die Rich-Text-Elemente verwendet werden.
- AutomationPeer: Basisklasse für Microsoft UI Automation Peers, die XAML-Steuerelemente für einen Microsoft UI Automation Listener darstellen. IRawElementProviderSimple.
- Verschiedenes: CacheMode, ColumnDefinition, DependencyObjectCollection, InputScope, InputScopeName, PageStackEntry, PrintDocument, RowDefinition, TimelineMarker, TriggerAction, TriggerBase.
Konstruktoren
DependencyObject() |
Stellt das Initialisierungsverhalten der Basisklasse für abgeleitete Klassen von DependencyObject bereit. |
Eigenschaften
Dispatcher |
Ruft den CoreDispatcher ab, dem dieses Objekt zugeordnet ist. Der CoreDispatcher stellt eine Einrichtung dar, die auf das DependencyObject im UI-Thread zugreifen kann, auch wenn der Code durch einen Nicht-UI-Thread initiiert wird. |
Methoden
ClearValue(DependencyProperty) |
Löscht den lokalen Wert einer Abhängigkeitseigenschaft. |
GetAnimationBaseValue(DependencyProperty) |
Gibt einen für eine Abhängigkeitseigenschaft festgelegten Basiswert zurück, 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 wird. |
RegisterPropertyChangedCallback(DependencyProperty, DependencyPropertyChangedCallback) |
Registriert eine Benachrichtigungsfunktion, um Änderungen an einer bestimmten Abhängigkeitsproperty auf dieser DependencyObject-Instanz zu hören. |
SetValue(DependencyProperty, Object) |
Legt den lokalen Wert einer Abhängigkeitseigenschaft auf einem Abhängigkeitsobjekt fest. |
UnregisterPropertyChangedCallback(DependencyProperty, Int64) |
Abbrechen einer Änderungsbenachrichtigung, die zuvor durch Aufrufen von RegisterPropertyChangedCallback registriert wurde. |
Gilt für:
Weitere Informationen
Feedback
Feedback senden und anzeigen für