DependencyObject Clase

Definición

Representa un objeto que participa en el 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
Object Platform::Object IInspectable DependencyObject
Derivado
Atributos

Ejemplos

En este ejemplo se define una clase que deriva de DependencyObjecty 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 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 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 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 y Set los 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 personalizados y también pueden usarlos desde el código de la aplicación como alternativa al uso de 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 principal de la interfaz de usuario del Windows Runtime para todas las DependencyObject instancias.
  • La propiedad DispatcherQueue para escenarios de subprocesos avanzados. DispatcherQueue permite que un subproceso de trabajo ejecute código que usa pero DependencyObject no está en el subproceso de la interfaz de usuario, ya que puede aplazar la ejecución a una operación asincrónica que no bloqueará ni interferirá de otro modo con el subproceso de interfaz de usuario. Consulte la sección "DependencyObject y subproceso" 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 DependencyObject instancias 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 DependencyObject instancias 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 directamente DependencyObject porque tiene DependencyObject afinidad de subproceso de interfaz de usuario solo. 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 desde DependencyObject un subproceso de trabajo. Sin embargo, debes obtener un objeto DispatcherQueue (el valor de DependencyObject.DispatcherQueue) de un DependencyObject para lograr 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. 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 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 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.

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 para DispatcherQueue 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 DependencyObjectcon problemas de subprocesos relacionados si está definiendo sus propios DependencyObject tipos e intenta usarlos para orígenes de datos u otros escenarios en los que un 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 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

Nombre Description
DependencyObject()

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

Propiedades

Nombre Description
Dispatcher

Siempre devuelve null en una aplicación de SDK de Aplicaciones para Windows. Use DispatcherQueue en su lugar.

DispatcherQueue

Obtiene el objeto DispatcherQueue al que está asociado este objeto. DispatcherQueue representa una instalación que puede acceder al DependencyObject en el subproceso de la 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.

Se aplica a

Consulte también