DependencyObject 类

定义

表示参与依赖属性系统的对象。

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
继承
Object Platform::Object IInspectable DependencyObject
派生
属性

示例

此示例定义派生自 DependencyObject的类,并定义附加属性以及标识符字段。 此类的方案是,它是一个服务类,它声明了其他 UI 元素可以在 XAML 中设置的附加属性。 服务可能会在运行时对这些 UI 元素上的附加属性值执行操作。

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;
    }
}

此示例演示一个简单的依赖属性声明。 对 GetValue 的调用构成了 get 新依赖属性的属性包装器的完整访问器实现。 对 SetValue 的调用构成了访问器实现的 set 整个部分。 有关更多示例,请参阅 自定义依赖属性

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); }
    }
}

注解

DependencyObject 在其许多派生类上启用依赖属性系统服务,并且是许多重要 UI 相关类(如 UIElementGeometryFrameworkTemplateStyleResourceDictionary)的直接基类。 有关如何支持依赖属性的详细信息 DependencyObject ,请参阅 依赖属性概述

依赖属性系统的主要功能是计算属性值,并提供有关已更改的值的系统通知。 参与依赖属性系统的另一个关键类是 DependencyPropertyDependencyProperty 允许将依赖属性注册到属性系统中,而 DependencyObject 作为基类,对象可以使用和设置依赖属性。

以下是 DependencyObject 提供或支持的一些值得注意的服务和特征:

  • 依赖属性承载对现有Windows 运行时依赖属性的支持。
  • 自定义依赖属性托管支持。 可以通过调用 Register 方法并将该方法的返回值存储为类中的 DependencyObject 公共静态属性来注册依赖属性。
  • 附加属性承载对现有Windows 运行时附加属性的支持。
  • 自定义附加属性托管支持。 通过调用 RegisterAttached 方法并将方法的返回值存储为类中的公共静态属性,可以注册附加属性用法的依赖属性。
  • GetSet 上存在 DependencyObject的任何依赖属性值的实用工具方法。 在定义自定义依赖属性 包装器时使用这些包装器 ,还可以从应用代码将其用作使用现有 包装器 属性的替代方法。
  • 用于检查元数据或属性值的高级方案实用工具 (例如 GetAnimationBaseValue) 。
  • 为所有DependencyObject实例强制实施与Windows 运行时的main UI 线程的线程关联。
  • 高级线程方案的 DispatcherQueue 属性。 DispatcherQueue允许工作线程运行使用 DependencyObject 但不在 UI 线程上的代码,因为它可以将执行延迟到不会阻止或以其他方式干扰 UI 线程的异步操作。 请参阅下面的“DependencyObject 和线程处理”部分。
  • 基本数据绑定和样式设置支持,方法是允许将属性设置为表达式,以便在对象生存期的稍后某个时间计算。 依赖项属性概述中更详细地介绍了这些概念。 另请参阅 深入的数据绑定

DependencyObject 和线程处理

必须在与应用的当前窗口关联的 UI 线程上创建所有DependencyObject实例。 这由系统强制实施,这对代码有两个重要含义:

  • 从两个 DependencyObject 实例使用 API 的代码将始终在同一线程(始终为 UI 线程)上运行。 在这种情况下,通常不会遇到线程问题。
  • 未在main UI 线程上运行的代码无法直接访问 ,DependencyObject因为 DependencyObject 仅具有与 UI 线程的线程关联。 只有 UI 线程上运行的代码才能更改甚至读取依赖属性的值。 例如,使用 .NET 任务 或显式 ThreadPool 线程启动的工作线程将无法读取依赖属性或调用其他 API。

不会完全阻止使用 DependencyObject 工作线程中的 。 但是,必须从 DependencyObject (DependencyObject.DispatcherQueue 的值获取 DispatcherQueue 对象) ,以便跨越应用 UI 线程与系统上运行的任何其他线程之间的有意分离。 公开 DispatcherQueueTryEnqueue 方法以运行可等待代码。 由于它启用跨线程的访问, DependencyObject.DispatcherQueue 因此 是可从非 UI 线程访问且不引发跨线程异常的或其任何子类的唯一实例 API DependencyObjectDependencyObject如果尝试从工作线程或任何其他非 UI 线程调用它们,则所有其他 API 都会引发异常。

通常可以在典型的 UI 代码中避免线程问题。 但是,设备通常不与 UI 线程关联。 如果使用从设备获取的信息来实时更新 UI,则通常必须获取 以便 DispatcherQueue 更新 UI。 另一种情况是,用于访问服务的代码可能不会在 UI 线程上运行。

一种代码方案:如果你正在定义自己的DependencyObject类型并尝试将它们用于数据源,或者由于对象与 UI) 不直接相关,因此不一定适合 (,DependencyObject则可能会遇到DependencyObject与线程相关的问题。 例如,你可能正在尝试使用后台线程或其他工作线程进行性能优化,这些线程在演示之前或者为了响应设备、服务或其他外部输入而更改对象的值。 评估方案是否真的需要依赖属性;也许标准属性就足够了。

DependencyObject 派生类

DependencyObject 是多个直接派生类的父类,这些类都是用于应用及其 XAML UI 的编程模型的基础。 下面是一些值得注意的派生类:

构造函数

DependencyObject()

DependencyObject 派生类提供基类初始化行为。

属性

Dispatcher

始终在Windows 应用 SDK应用中返回 null 。 请改用 DispatcherQueue

DispatcherQueue

DispatcherQueue获取与此对象关联的 。 表示 DispatcherQueue 一个可以在 UI 线程上访问 DependencyObject 的设施,即使代码是由非 UI 线程启动的。

方法

ClearValue(DependencyProperty)

清除依赖属性的本地值。

GetAnimationBaseValue(DependencyProperty)

返回为依赖属性建立的任何基值,该基值适用于动画未处于活动状态的情况。

GetValue(DependencyProperty)

DependencyObject 返回依赖属性的当前有效值。

ReadLocalValue(DependencyProperty)

如果设置了本地值,则返回依赖属性的本地值。

RegisterPropertyChangedCallback(DependencyProperty, DependencyPropertyChangedCallback)

注册通知函数,用于侦听此 DependencyObject 实例上对特定 DependencyProperty 的更改。

SetValue(DependencyProperty, Object)

设置 DependencyObject 上依赖属性的本地值。

UnregisterPropertyChangedCallback(DependencyProperty, Int64)

取消以前通过调用 RegisterPropertyChangedCallback 注册的更改通知。

适用于

另请参阅