DependencyObject Clase

Definición

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
Object Platform::Object IInspectable DependencyObject
Derivado
Atributos

Ejemplos

En este ejemplo se define una clase que deriva de DependencyObjecty 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.
  • Gety Set 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 un DependencyObject 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 tiene DependencyObject 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 DependencyObjectproblemas 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:

Constructores

DependencyObject()

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

Propiedades

Dispatcher

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

DispatcherQueue

Obtiene el objeto DispatcherQueue al que está asociado este objeto. DispatcherQueue 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 mediante una llamada a RegisterPropertyChangedCallback.

Se aplica a

Consulte también