DependencyObject Clase

Definición

Representa un objeto que forma parte del 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 Información general sobre 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
Object Platform::Object IInspectable DependencyObject
Derivado
Atributos

Requisitos de Windows

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 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 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 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 permite el registro de propiedades de dependencia en el sistema de propiedades, mientras que DependencyObject como 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 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 dependencyObject. Estos 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 "contenedoras" existentes.
  • Utilidad de escenario avanzado para examinar los metadatos o los valores de propiedad (por ejemplo , GetAnimationBaseValue).
  • Aplicación de 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 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 y threading" 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 instancias de DependencyObject 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 instancias de DependencyObject siempre se ejecutará en el mismo subproceso, que siempre es el subproceso de la 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 directamente a DependencyObject porque dependencyObject tiene afinidad de subproceso solo con el subproceso de interfaz de usuario. 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 propiedades de dependencia ni llamar a otras API.

No se le impide completamente usar DependencyObject desde un subproceso de trabajo. Sin embargo, debes obtener un objeto CoreDispatcher (el valor de DependencyObject.Dispatcher) de dependencyObject para evitar 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 implementar 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 producen 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 subprocesos normalmente se pueden evitar en el código típico de la interfaz de usuario. Sin embargo, los dispositivos no suelen estar asociados con el subproceso de 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á relacionado directamente 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:

Constructores

DependencyObject()

Proporciona el comportamiento de inicialización de clases base para las clases derivadas de DependencyObject .

Propiedades

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 un subproceso que no es de interfaz de usuario inicia el código.

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 llamando a RegisterPropertyChangedCallback.

Se aplica a

Consulte también