DependencyObject Clase
Definición
Importante
Parte de la información hace referencia a la versión preliminar del producto, que puede haberse modificado sustancialmente antes de lanzar la versión definitiva. Microsoft no otorga ninguna garantía, explícita o implícita, con respecto a la información proporcionada aquí.
Representa un objeto que forma parte del sistema de propiedades de dependencia.
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
- Herencia
- Derivado
- Atributos
Ejemplos
En este ejemplo se define una clase que deriva de DependencyObject
y define una propiedad adjunta junto con el campo de identificador. El escenario de esta clase es que es una clase de servicio que declara una propiedad adjunta que otros elementos de interfaz de usuario pueden establecer en XAML El servicio actúa potencialmente en los valores de propiedad adjunta en esos elementos de interfaz de usuario en tiempo de ejecución.
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;
}
}
En este ejemplo se muestra una declaración de propiedad de dependencia simple. Una llamada a GetValue constituye la totalidad de la implementación del get
descriptor de acceso para el contenedor de propiedades de la nueva propiedad de dependencia. Una llamada a SetValue constituye la totalidad de la implementación del set
descriptor de acceso. Para obtener más ejemplos, consulte Propiedades de dependencia personalizadas.
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); }
}
}
Comentarios
La DependencyObject
clase habilita los servicios del sistema de propiedades de dependencia en sus muchas clases derivadas y es la clase base inmediata de muchas clases importantes relacionadas con la interfaz de usuario, como UIElement, Geometry, FrameworkTemplate, Style y ResourceDictionary. Para obtener más información sobre cómo DependencyObject
admite las propiedades de dependencia, consulte Información general sobre las propiedades de dependencia.
La función principal del sistema de propiedades de dependencia es calcular los valores de las propiedades y proporcionar notificaciones del sistema sobre los valores que han cambiado. Otra clase clave que participa en el sistema de propiedades de dependencia es DependencyProperty.
DependencyProperty habilita el registro de propiedades de dependencia en el sistema de propiedades, mientras que DependencyObject
como una clase base permite a los objetos usar y establecer las propiedades de dependencia.
Estos son algunos servicios y características importantes que DependencyObject proporciona o admite:
- Compatibilidad con el hospedaje de propiedades de dependencia para las propiedades de dependencia Windows Runtime existentes.
- Compatibilidad con el hospedaje de propiedades de dependencia personalizada. Para registrar una propiedad de dependencia, llame al método Register y almacene el valor devuelto del método como una propiedad estática pública en la
DependencyObject
clase. - Compatibilidad con el hospedaje de propiedades adjuntas para las propiedades adjuntas de Windows Runtime existentes.
- Compatibilidad con hospedaje de propiedades adjuntas personalizadas. Para registrar una propiedad de dependencia para el uso de la propiedad adjunta, llame al método RegisterAttached y almacene el valor devuelto del método como una propiedad estática pública en la clase.
-
Get
ySet
los métodos de utilidad para los valores de las propiedades de dependencia que existen en .DependencyObject
Se usan al definir contenedores de propiedades de dependencia personalizadas y también se pueden usar desde el código de la aplicación como alternativa al uso de las propiedades de contenedor existentes. - Utilidad de escenario avanzado para examinar los metadatos o los valores de propiedad (por ejemplo , GetAnimationBaseValue).
- Aplicación de la afinidad de subproceso con el subproceso de interfaz de usuario principal del Windows Runtime para todas las
DependencyObject
instancias. - La propiedad DispatcherQueue para escenarios avanzados de subprocesos.
DispatcherQueue
permite a un subproceso de trabajo ejecutar código que usa unDependencyObject
pero no está en el subproceso de interfaz de usuario, ya que puede aplazar la ejecución a una operación asincrónica que no bloqueará ni interferirá en el subproceso de la interfaz de usuario. Consulte la sección "DependencyObject
y el subproceso" a continuación. - Compatibilidad básica con el enlace de datos y el estilo, al permitir que las propiedades se establezcan como expresiones que se evaluarán en algún momento posterior de la duración de un objeto. Estos conceptos se explican con más detalle en Introducción a las propiedades de dependencia. Consulte también Enlace de datos en profundidad.
DependencyObject y subprocesos
Todas las DependencyObject
instancias se deben crear en el subproceso de interfaz de usuario asociado a la ventana actual de una aplicación. Esto se aplica por el sistema y hay dos implicaciones importantes de esto para el código:
- El código que usa la API de dos
DependencyObject
instancias siempre se ejecutará en el mismo subproceso, que siempre es el subproceso de interfaz de usuario. Normalmente no se encuentra en problemas de subprocesos en este escenario. - El código que no se ejecuta en el subproceso principal de la interfaz de usuario no puede tener acceso
DependencyObject
directamente porque tieneDependencyObject
afinidad de subproceso con el subproceso de interfaz de usuario únicamente. Solo el código que se ejecuta en el subproceso de interfaz de usuario puede cambiar o incluso leer el valor de una propiedad de dependencia. Por ejemplo, un subproceso de trabajo que ha iniciado con una tarea de .NET o un subproceso de ThreadPool explícito no podrá leer las propiedades de dependencia ni llamar a otras API.
No se le bloquea completamente el uso de desde DependencyObject
un subproceso de trabajo. Sin embargo, debes obtener un objeto DispatcherQueue (el valor de DependencyObject.DispatcherQueue) de un DependencyObject
objeto para evitar la separación deliberada entre el subproceso de interfaz de usuario de la aplicación y cualquier otro subproceso que se ejecute en el sistema.
DispatcherQueue
expone el método TryEnqueue para ejecutar el código que se puede esperar. Dado que habilita el acceso entre subprocesos, DependencyObject.DispatcherQueue
es la única API de instancia de o cualquiera de DependencyObject
sus subclases a las que se puede acceder desde un subproceso que no es de interfaz de usuario sin iniciar una excepción entre subprocesos. Todas las demás DependencyObject
API inician una excepción si intenta llamarlas desde un subproceso de trabajo o cualquier otro subproceso que no sea de interfaz de usuario.
Normalmente, los problemas de subprocesos se pueden evitar en el código típico de la interfaz de usuario. Sin embargo, los dispositivos no suelen estar asociados al subproceso de interfaz de usuario. Si usas información obtenida de un dispositivo para actualizar la interfaz de usuario en tiempo real, a menudo debes obtener un para DispatcherQueue
que puedas actualizar la interfaz de usuario. Los servicios son otro caso en el que es posible que el código que use para acceder al servicio no se ejecute en el subproceso de interfaz de usuario.
Un escenario de código en el que puede encontrar DependencyObject
problemas relacionados con el subproceso si está definiendo sus propios DependencyObject
tipos e intenta usarlos para orígenes de datos u otros escenarios en DependencyObject
los que no es necesariamente adecuado (porque el objeto no está directamente relacionado con la interfaz de usuario). Por ejemplo, es posible que esté intentando realizar optimizaciones de rendimiento con subprocesos en segundo plano u otros subprocesos de trabajo que cambien los valores de los objetos antes de la presentación, o en respuesta a un dispositivo, servicio u otra entrada externa. Evalúe si realmente necesita propiedades de dependencia para su escenario; tal vez las propiedades estándar son adecuadas.
Clases derivadas de DependencyObject
DependencyObject
es la clase primaria para varias clases derivadas inmediatamente que son fundamentales para el modelo de programación que usas para la aplicación y su interfaz de usuario XAML. Estas son algunas de las clases derivadas importantes:
- UIElement: la clase base para la mayoría de los objetos visuales que pueden procesar la entrada en la interfaz de usuario. FrameworkElement se encuentra más en esta jerarquía, como es Control, por lo que hay cientos de controles y otras clases en el Windows Runtime que todas tienen la clase UIElement en sus jerarquías de clases.
- Clases de compatibilidad del sistema de estilo XAML: FrameworkTemplate (primario de ControlTemplate, DataTemplate, ItemsPanelTemplate), Style, SetterBase (primario de Setter), ToolTipTemplateSettings y otros TemplateSettings.
- Modelo de estado visual: Transition, VisualState, VisualStateGroup, VisualStateManager, VisualTransition.
- Compatibilidad con enlaces de datos: BindingBase (primario de Binding), CollectionViewSource, PropertyPath, RelativeSource.
- Animaciones con guion gráfico: Escala de tiempo (primaria del guión gráfico, animaciones con tipo, animaciones de tema), fotogramas clave con tipo (como ColorKeyFrame), KeySpline, EasingFunctionBase.
- Gráficos XAML y primitivos de representación: Brush, Geometry, GeneralTransform, GradientStop, PathFigure, PathSegment, Projection.
- Interoperabilidad de superficie de representación y creación de imágenes: ImageSource (primario de BitmapSource, RenderTargetBitmap, SurfaceImageSource y otros).
- Ventana: representa la ventana principal de la aplicación.
- FlyoutBase (primario de Flyout y MenuFlyout).
- ResourceDictionary: define los recursos con clave en XAML.
- TextElement: elemento primario de Block e Inline, a su vez son clases base para los elementos de texto usados para el contenido textBlock o los elementos de texto enriquecido.
- AutomationPeer: clase base para los elementos del mismo nivel de Microsoft Automatización de la interfaz de usuario que representan controles XAML a un agente de escucha de Microsoft Automatización de la interfaz de usuario. Además, IRawElementProviderSimple.
- Varios: CacheMode, ColumnDefinition, DependencyObjectCollection, InputScope, InputScopeName, PageStackEntry, PrintDocument, RowDefinition, TriggerAction, TriggerBase.
Constructores
DependencyObject() |
Proporciona el comportamiento de inicialización de clase base para las clases derivadas dependencyObject . |
Propiedades
Dispatcher |
Siempre devuelve |
DispatcherQueue |
Obtiene el objeto |
Métodos
ClearValue(DependencyProperty) |
Borra el valor local de una propiedad de dependencia. |
GetAnimationBaseValue(DependencyProperty) |
Devuelve cualquier valor base establecido para una propiedad de dependencia, que se aplicaría en los casos en los que una animación no está activa. |
GetValue(DependencyProperty) |
Devuelve el valor efectivo actual de una propiedad de dependencia de dependencyObject. |
ReadLocalValue(DependencyProperty) |
Devuelve el valor local de una propiedad de dependencia, si se establece un valor local. |
RegisterPropertyChangedCallback(DependencyProperty, DependencyPropertyChangedCallback) |
Registra una función de notificación para escuchar los cambios en una dependencyProperty específica en esta instancia de DependencyObject . |
SetValue(DependencyProperty, Object) |
Establece el valor local de una propiedad de dependencia en dependencyObject. |
UnregisterPropertyChangedCallback(DependencyProperty, Int64) |
Cancela una notificación de cambio registrada anteriormente mediante una llamada a RegisterPropertyChangedCallback. |