DependencyObject Classe
Définition
Important
Certaines informations portent sur la préversion du produit qui est susceptible d’être en grande partie modifiée avant sa publication. Microsoft exclut toute garantie, expresse ou implicite, concernant les informations fournies ici.
Représente un objet qui participe au système des propriétés de dépendance.
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
- Héritage
- Dérivé
- Attributs
Exemples
Cet exemple définit une classe qui dérive de DependencyObject
, et définit une propriété jointe avec le champ d’identificateur. Le scénario de cette classe est qu’il s’agit d’une classe de service qui déclare une propriété jointe que d’autres éléments d’interface utilisateur peuvent définir dans XAML Le service agit potentiellement sur les valeurs de propriété attachées sur ces éléments d’interface utilisateur au moment de l’exécution.
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;
}
}
Cet exemple montre une déclaration de propriété de dépendance simple. Un appel à GetValue constitue l’intégralité de l’implémentation de l’accesseur get
pour le wrapper de propriété de la nouvelle propriété de dépendance. Un appel à SetValue constitue l’intégralité de l’implémentation de l’accesseur set
. Pour plus d’exemples, consultez Propriétés de dépendance personnalisées.
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); }
}
}
Remarques
La DependencyObject
classe active les services système de propriété de dépendance sur ses nombreuses classes dérivées et est la classe de base immédiate de nombreuses classes importantes liées à l’interface utilisateur, telles que UIElement, Geometry, FrameworkTemplate, Style et ResourceDictionary. Pour plus d’informations sur la prise DependencyObject
en charge des propriétés de dépendance, consultez Vue d’ensemble des propriétés de dépendance.
La fonction principale du système de propriétés de dépendance est de calculer les valeurs des propriétés et de fournir une notification système sur les valeurs qui ont changé. Une autre classe de clé qui participe au système de propriétés de dépendance est DependencyProperty.
DependencyProperty permet l’inscription des propriétés de dépendance dans le système de propriétés, tandis qu’en tant que DependencyObject
classe de base permet aux objets d’utiliser et de définir les propriétés de dépendance.
Voici quelques services et caractéristiques notables que DependencyObject fournit ou prend en charge :
- Prise en charge de l’hébergement de propriétés de dépendance pour les propriétés de dépendance Windows Runtime existantes.
- Prise en charge de l’hébergement des propriétés de dépendance personnalisées. Vous inscrivez une propriété de dépendance en appelant la méthode Register et en stockant la valeur de retour de la méthode en tant que propriété statique publique dans votre
DependencyObject
classe. - Prise en charge de l’hébergement de propriétés jointes pour les Windows Runtime propriétés jointes existantes.
- Prise en charge de l’hébergement de propriétés jointes personnalisées. Vous inscrivez une propriété de dépendance pour l’utilisation de la propriété jointe en appelant la méthode RegisterAttached et en stockant la valeur de retour de la méthode en tant que propriété statique publique dans votre classe.
-
Get
etSet
méthodes d’utilitaire pour les valeurs de toutes les propriétés de dépendance qui existent sur unDependencyObject
. Vous les utilisez lors de la définition de wrappers de propriétés de dépendance personnalisés et vous pouvez également les utiliser à partir du code d’application comme alternative à l’utilisation des propriétés de wrapper existantes. - Utilitaire de scénario avancé pour examiner les métadonnées ou les valeurs de propriété (par exemple GetAnimationBaseValue).
- Application de l’affinité de thread au thread d’interface utilisateur main du Windows Runtime pour toutes les
DependencyObject
instances. - Propriété DispatcherQueue pour les scénarios de threads avancés. permet
DispatcherQueue
à un thread de travail d’exécuter du code qui utilise unDependencyObject
mais n’est pas sur le thread d’interface utilisateur, car il peut différer l’exécution vers une opération asynchrone qui ne bloque pas ou n’interfère pas avec le thread d’interface utilisateur. Consultez la section «DependencyObject
et threading » ci-dessous. - Prise en charge de la liaison et du style de données de base, en permettant aux propriétés d’être définies en tant qu’expressions à évaluer ultérieurement dans la durée de vie d’un objet. Ces concepts sont expliqués plus en détail dans Vue d’ensemble des propriétés de dépendance. Voir aussi Liaison de données en détail.
DependencyObject et threading
Toutes les DependencyObject
instances doivent être créées sur le thread d’interface utilisateur associé à la fenêtre actuelle pour une application. Cela est appliqué par le système, et cela a deux implications importantes pour votre code :
- Le code qui utilise l’API de deux
DependencyObject
instances sera toujours exécuté sur le même thread, qui est toujours le thread d’interface utilisateur. Vous ne rencontrez généralement pas de problèmes de threading dans ce scénario. - Le code qui ne s’exécute pas sur le thread d’interface utilisateur main ne peut pas accéder directement à un
DependencyObject
, car un a uneDependencyObject
affinité de thread avec le thread d’interface utilisateur uniquement. Seul le code qui s’exécute sur le thread d’interface utilisateur peut modifier ou même lire la valeur d’une propriété de dépendance. Par exemple, un thread de travail que vous avez initié avec une tâche .NET ou un thread ThreadPool explicite ne peut pas lire les propriétés de dépendance ou appeler d’autres API.
Vous n’êtes pas complètement empêché d’utiliser un DependencyObject
à partir d’un thread de travail. Toutefois, vous devez obtenir un objet DispatcherQueue (la valeur de DependencyObject.DispatcherQueue) à partir d’un DependencyObject
afin d’obtenir la séparation délibérée entre le thread d’interface utilisateur de l’application et les autres threads en cours d’exécution sur le système. Le DispatcherQueue
expose la méthode TryEnqueue pour exécuter votre code awaitable. Étant donné qu’elle permet l’accès entre les threads, DependencyObject.DispatcherQueue
est la seule api instance de DependencyObject
ou l’une de ses sous-classes accessibles à partir d’un thread autre que l’interface utilisateur sans lever d’exception de thread croisé. Toutes les autres DependencyObject
API lèvent une exception si vous tentez de les appeler à partir d’un thread de travail ou de tout autre thread non-interface utilisateur.
Les problèmes de threading peuvent généralement être évités dans le code d’interface utilisateur standard. Toutefois, les appareils ne sont généralement pas associés au thread d’interface utilisateur. Si vous utilisez les informations obtenues à partir d’un appareil pour mettre à jour l’interface utilisateur en temps réel, vous devez souvent obtenir un DispatcherQueue
pour pouvoir mettre à jour l’interface utilisateur. Les services sont un autre cas où le code que vous utilisez pour accéder au service peut ne pas s’exécuter sur le thread d’interface utilisateur.
Un scénario de code où vous pouvez rencontrer DependencyObject
des problèmes liés au threading si vous définissez vos propres DependencyObject
types et que vous essayez de les utiliser pour des sources de données, ou d’autres scénarios où un DependencyObject
n’est pas nécessairement approprié (car l’objet n’est pas directement lié à l’interface utilisateur). Par exemple, vous pouvez essayer d’optimiser les performances avec des threads d’arrière-plan ou d’autres threads de travail qui modifient les valeurs des objets avant la présentation ou en réponse à un appareil, un service ou une autre entrée externe. Évaluez si vous avez vraiment besoin de propriétés de dépendance pour votre scénario ; peut-être que les propriétés standard sont adéquates.
Classes dérivées de DependencyObject
DependencyObject
est la classe parente de plusieurs classes dérivées immédiatement qui sont toutes fondamentales pour le modèle de programmation que vous utilisez pour votre application et son interface utilisateur XAML. Voici quelques-unes des classes dérivées notables :
- UIElement : classe de base pour la plupart des objets visuels qui peuvent traiter les entrées dans l’interface utilisateur. FrameworkElement étant plus loin dans cette hiérarchie, tout comme Control, il existe des centaines de contrôles et d’autres classes dans le Windows Runtime qui ont toutes la classe UIElement dans leurs hiérarchies de classes.
- Classes de prise en charge système de style XAML : FrameworkTemplate (parent de ControlTemplate, DataTemplate, ItemsPanelTemplate), Style, SetterBase (parent de Setter), ToolTipTemplateSettings et autres TemplateSettings.
- Modèle d’état visuel : Transition, VisualState, VisualStateGroup, VisualStateManager, VisualTransition.
- Prise en charge de la liaison de données : BindingBase (parent de Binding), CollectionViewSource, PropertyPath, RelativeSource.
- Animations de storyboard : Chronologie (parent de Storyboard, animations typées, animations de thème), images clés typées (comme ColorKeyFrame), KeySpline, EasingFunctionBase.
- Graphiques XAML et primitives de rendu : Brush, Geometry, GeneralTransform, GradientStop, PathFigure, PathSegment, Projection.
- Création d’images et interopérabilité de la surface de rendu : ImageSource (parent de BitmapSource, RenderTargetBitmap, SurfaceImageSource et autres).
- Fenêtre : représente la fenêtre d’application main.
- FlyoutBase (parent de Flyout et MenuFlyout).
- ResourceDictionary : définit les ressources à clé en XAML.
- TextElement : parent de Block et Inline, ces classes sont à leur tour des classes de base pour les éléments de texte utilisés pour le contenu TextBlock ou les éléments de texte enrichi.
- AutomationPeer : classe de base pour les homologues Microsoft UI Automation qui représentent des contrôles XAML à un écouteur Microsoft UI Automation. En outre, IRawElementProviderSimple.
- Divers : CacheMode, ColumnDefinition, DependencyObjectCollection, InputScope, InputScopeName, PageStackEntry, PrintDocument, RowDefinition, TriggerAction, TriggerBase.
Constructeurs
DependencyObject() |
Fournit le comportement d’initialisation de classe de base pour les classes dérivées de DependencyObject . |
Propriétés
Dispatcher |
Retourne |
DispatcherQueue |
Obtient le |
Méthodes
ClearValue(DependencyProperty) |
Efface la valeur locale d’une propriété de dépendance. |
GetAnimationBaseValue(DependencyProperty) |
Retourne toute valeur de base établie pour une propriété de dépendance, qui s’appliquerait dans les cas où une animation n’est pas active. |
GetValue(DependencyProperty) |
Retourne la valeur effective actuelle d’une propriété de dépendance à partir d’un DependencyObject. |
ReadLocalValue(DependencyProperty) |
Retourne la valeur locale d’une propriété de dépendance, si une valeur locale est définie. |
RegisterPropertyChangedCallback(DependencyProperty, DependencyPropertyChangedCallback) |
Inscrit une fonction de notification pour écouter les modifications apportées à un DependencyProperty spécifique sur ce instance DependencyObject. |
SetValue(DependencyProperty, Object) |
Définit la valeur locale d’une propriété de dépendance sur un DependencyObject. |
UnregisterPropertyChangedCallback(DependencyProperty, Int64) |
Annule une notification de modification précédemment inscrite en appelant RegisterPropertyChangedCallback. |