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 am Abhängigkeitseigenschaftssystem 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 DependencyObject, und definiert eine angefügte Eigenschaft zusammen mit dem Bezeichnerfeld. 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 zur Laufzeit auf die Werte der angefügten Eigenschaft 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 Deklaration der Abhängigkeitseigenschaft. Ein Aufruf von GetValue stellt die gesamte Accessorimplementierung get für den Eigenschaftenwrapper 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); }
}
}
Hinweise
Die DependencyObject Klasse ermöglicht Abhängigkeitseigenschaftensystemdienste für seine vielen abgeleiteten Klassen und ist die direkte Basisklasse vieler wichtiger UI-bezogene Klassen, z. B. UIElement, Geometry, FrameworkTemplate, Style und ResourceDictionary. Weitere Informationen zur DependencyObject Unterstützung von Abhängigkeitseigenschaften finden Sie in der Übersicht über Abhängigkeitseigenschaften.
Die primäre Funktion des Abhängigkeitseigenschaftssystems besteht darin, die Werte von Eigenschaften zu berechnen und eine Systembenachrichtigung über geänderte Werte bereitzustellen. Eine weitere Schlüsselklasse, die am Abhängigkeitseigenschaftssystem teilnimmt, ist DependencyProperty.
DependencyProperty ermöglicht die Registrierung von Abhängigkeitseigenschaften im Eigenschaftensystem, während DependencyObject als Basisklasse Objekte die Abhängigkeitseigenschaften verwenden und festlegen können.
Hier sind einige wichtige Dienste und Merkmale, die DependencyObject bereitstellt oder unterstützt:
- Unterstützung von Abhängigkeitseigenschaftshosting für die vorhandenen Windows-Runtime Abhängigkeitseigenschaften.
- Unterstützung für benutzerdefinierte Abhängigkeitseigenschaftshosting. Sie registrieren eine Abhängigkeitseigenschaft, indem Sie die Register-Methode aufrufen und den Rückgabewert der Methode als öffentliche statische Eigenschaft in Ihrer
DependencyObjectKlasse speichern. - Unterstützung für angefügte Eigenschaftenhosting für die vorhandenen Windows-Runtime angefügten Eigenschaften.
- Unterstützung für benutzerdefinierte angefügte Eigenschaftenhosting. Sie registrieren eine Abhängigkeitseigenschaft für die Verwendung der angefügten Eigenschaft, indem Sie die RegisterAttached-Methode aufrufen und den Rückgabewert der Methode als öffentliche statische Eigenschaft in Ihrer Klasse speichern.
-
GetundSetHilfsmethoden für Werte von Abhängigkeitseigenschaften, die für einDependencyObject. Sie verwenden diese beim Definieren von benutzerdefinierten Abhängigkeitseigenschaftenwrappern und können sie auch aus App-Code als Alternative zur Verwendung vorhandener Wrappereigenschaften verwenden. - Advanced-scenario utility for examining metadata or property values (for example GetAnimationBaseValue).
- Erzwingen der Threadaffinität zum Haupt-UI-Thread der Windows-Runtime für alle
DependencyObjectInstanzen. - Die DispatcherQueue-Eigenschaft für erweiterte Threadingszenarien. Der
DispatcherQueueArbeitsthread kann Code ausführen, der einenDependencyObject, aber nicht im UI-Thread verwendet, da er die Ausführung auf einen asynchronen Vorgang zurückstellen kann, der den UI-Thread nicht blockiert oder anderweitig beeinträchtigt. Siehe Abschnitt "DependencyObjectund Threading" weiter unten. - Grundlegende Datenbindung 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. Diese Konzepte werden in der Übersicht über Abhängigkeitseigenschaften ausführlicher erläutert. Siehe auch 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 für Ihren Code gibt es zwei wichtige Auswirkungen:
- Code, der API aus zwei
DependencyObjectInstanzen verwendet, wird immer im selben Thread ausgeführt, was 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 darauf zugreifen
DependencyObject, da nur eineDependencyObjectThreadaffinität zum UI-Thread besteht. Nur Code, der im UI-Thread ausgeführt wird, kann den Wert einer Abhängigkeitseigenschaft ändern oder sogar lesen. Beispielsweise kann ein Arbeitsthread, 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, einen DependencyObject Arbeitsthread zu verwenden. Sie müssen jedoch ein DispatcherQueue-Objekt (den Wert von DependencyObject.DispatcherQueue) aus einem DependencyObject Objekt abrufen, um die bewusste Trennung zwischen dem App-UI-Thread und allen anderen Threads, die auf dem System ausgeführt werden, zu durchlaufen. Die DispatcherQueueTryEnqueue-Methode wird verfügbar gemacht, um den erwarteten Code auszuführen. Da der Zugriff über Threads hinweg aktiviert wird, DependencyObject.DispatcherQueue handelt es sich um die einzige Instanz-API oder DependencyObject eine 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 Arbeitsthread 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 werden, um die Benutzeroberfläche in Echtzeit zu aktualisieren, müssen Sie häufig eine DispatcherQueue Sodass 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, bei dem möglicherweise Probleme beim Threading auftreten DependencyObject, wenn Sie ihre eigenen DependencyObject Typen definieren und versuchen, diese für Datenquellen zu verwenden, oder andere Szenarien, in denen ein DependencyObject Objekt 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 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 alle grundlegend für das Programmiermodell sind, das Sie für Ihre App und ihre XAML-UI verwenden. 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-Runtime, die alle über die UIElement-Klasse in ihren Klassenhierarchien verfügen.
- 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, eingegebene Animationen, Designanimationen), eingegebene Keyframes (wie ColorKeyFrame), KeySpline, EasingFunctionBase.
- XAML-Grafiken und Rendergrundtypen: Brush, Geometry, GeneralTransform, GradientStop, PathFigure, PathSegment, Projection.
- ImageSource (übergeordnetes Element von BitmapSource, RenderTargetBitmap, SurfaceImageSource und anderen).
- Fenster: stellt das Hauptfenster der App dar.
- FlyoutBase (übergeordnetes Element von Flyout und MenuFlyout).
- ResourceDictionary: definiert Schlüsselressourcen in XAML.
- TextElement: Übergeordnetes Element von Block und Inline sind diese wiederum 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
| Name | Beschreibung |
|---|---|
| DependencyObject() |
Stellt das Initialisierungsverhalten der Basisklasse für abgeleitete DependencyObject-Klassen bereit. |
Eigenschaften
| Name | Beschreibung |
|---|---|
| Dispatcher |
Gibt immer in einer Windows App SDK-App zurück |
| DispatcherQueue |
Ruft ab |
Methoden
| Name | Beschreibung |
|---|---|
| ClearValue(DependencyProperty) |
Löscht den lokalen Wert einer Abhängigkeitseigenschaft. |
| GetAnimationBaseValue(DependencyProperty) |
Gibt einen Basiswert zurück, der für eine Abhängigkeitseigenschaft eingerichtet wurde, was in Fällen angewendet wird, 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 DependencyProperty für diese DependencyObject-Instanz zu überwachen. |
| 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. |