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 participa en el sistema de propiedades de dependencia. DependencyObject 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 Introducción a las propiedades de dependencia.
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
- Herencia
- Derivado
- Atributos
Requisitos de Windows
| Requisitos | Description |
|---|---|
| Familia de dispositivos |
Windows 10 (se introdujo en la versión 10.0.10240.0)
|
| API contract |
Windows.Foundation.UniversalApiContract (se introdujo en la versión v1.0)
|
Ejemplos
En este ejemplo se define una clase que deriva de DependencyObject y se 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 puede actuar 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 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
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 descriptor de acceso get para el contenedor de propiedades de la nueva propiedad de dependencia. Una llamada a SetValue constituye la totalidad de la implementación del descriptor de acceso set . 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); }
}
}
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
Comentarios
La clase DependencyObject habilita los servicios del sistema de propiedades de dependencia en sus muchas clases derivadas. Para obtener más información sobre el concepto de propiedad de dependencia, consulte Introducción a las propiedades de dependencia.
La función principal del sistema de propiedades de dependencia es calcular los valores de las propiedades y proporcionar una notificación del sistema sobre los valores que han cambiado. Otra clase clave que participa en el sistema de propiedades de dependencia es DependencyProperty. DependencyProperty permite el registro de propiedades de dependencia en el sistema de propiedades, mientras que DependencyObject como clase base permite que los objetos usen y establezcan 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 existentes Windows Runtime.
- Compatibilidad con hospedaje de propiedades de dependencia personalizadas. 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 clase DependencyObject.
- 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.
- Obtiene y establece métodos de utilidad para los valores de las propiedades de dependencia que existen en un DependencyObject. Los usa al definir "contenedores" de propiedades de dependencia personalizadas y también pueden usarlos desde el código de la aplicación como alternativa al uso de las propiedades "contenedoras" 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 instancias de DependencyObject.
- La propiedad Dispatcher para escenarios avanzados de subprocesos. Obtener el valor dispatcher proporciona una referencia a un objeto CoreDispatcher . Con CoreDispatcher, un subproceso de trabajo puede ejecutar código que use dependencyObject, pero no está en el subproceso de la interfaz de usuario, ya que CoreDispatcher 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 and threading" (DependencyObject and threading) a continuación.
- Compatibilidad con el enlace de datos básico 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 hilos
Todas las instancias de DependencyObject deben crearse en el subproceso de interfaz de usuario asociado a la ventana actual de una aplicación. El sistema aplica esto y hay dos implicaciones importantes para el código:
- El código que usa la API de dos instancias de DependencyObject siempre se ejecutará en el mismo subproceso, que siempre es el subproceso de la interfaz de usuario. Normalmente no se produce ningún problema de subproceso en este escenario.
- El código que no se ejecuta en el subproceso principal de la interfaz de usuario no puede tener acceso a DependencyObject directamente porque dependencyObject tiene afinidad de subproceso de subproceso de subproceso de interfaz de usuario únicamente. Solo el código que se ejecuta en el subproceso de la 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 propiedades de dependencia ni llamar a otras API.
No se le bloquea completamente el uso de DependencyObject desde un subproceso de trabajo. Sin embargo, debe obtener un objeto CoreDispatcher (el valor de DependencyObject.Dispatcher) de dependencyObject para llegar a través de la separación deliberada entre el subproceso de la interfaz de usuario de la aplicación y cualquier otro subproceso que se ejecute en el sistema. CoreDispatcher expone el método RunAsync. Llame a RunAsync para ejecutar el código que se puede esperar ( IAsyncAction). Si es código simple, puede usar una expresión lambda; de lo contrario, puede implementarlo como delegado (DispatchedHandler). El sistema determina una hora a la que se puede ejecutar el código. Dado que habilita el acceso entre subprocesos, DependencyObject.Dispatcher es la única API de instancia de DependencyObject o cualquiera de sus subclases a las que se puede acceder desde un subproceso que no sea de interfaz de usuario sin iniciar una excepción entre subprocesos. Todas las demás API dependencyObject inician una excepción si intenta llamarlas desde un subproceso de trabajo o cualquier otro subproceso que no sea de interfaz de usuario.
Los problemas de subproceso normalmente 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 la interfaz de usuario. Si usa información obtenida de un dispositivo para actualizar la interfaz de usuario en tiempo real, a menudo debe obtener un CoreDispatcher para que pueda 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 esté ejecutando en el subproceso de la interfaz de usuario.
Un escenario de código en el que podría encontrarse con problemas de subprocesos relacionados con DependencyObject si define sus propios tipos dependencyObject e intenta usarlos para orígenes de datos u otros escenarios en los que dependencyObject no es necesariamente adecuado (porque el objeto no está directamente relacionado con la interfaz de usuario). Por ejemplo, es posible que esté intentando 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 de 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 la 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 de Guión gráfico, animaciones tipadas, 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 (elemento primario de Flyout y MenuFlyout).
- ResourceDictionary: define los recursos con clave en XAML.
- TextElement: primario de Block e Inline, estos 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 Microsoft Automatización de la interfaz de usuario elementos del mismo nivel 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, TimelineMarker, TriggerAction, TriggerBase.
Constructores
| Nombre | Description |
|---|---|
| DependencyObject() |
Proporciona el comportamiento de inicialización de clase base para las clases derivadas de DependencyObject . |
Propiedades
| Nombre | Description |
|---|---|
| Dispatcher |
Obtiene el CoreDispatcher al que está asociado este objeto. CoreDispatcher representa una instalación que puede tener acceso a DependencyObject en el subproceso de interfaz de usuario incluso si el código lo inicia un subproceso que no es de interfaz de usuario. |
Métodos
| Nombre | Description |
|---|---|
| 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 llamando a RegisterPropertyChangedCallback. |