DependencyObject 类
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
表示参与依赖属性系统的对象。
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
- 继承
- 派生
- 属性
示例
此示例定义派生自 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 相关类(如 UIElement、 Geometry、 FrameworkTemplate、 Style 和 ResourceDictionary)的直接基类。 有关如何支持依赖属性的详细信息 DependencyObject
,请参阅 依赖属性概述。
依赖属性系统的主要功能是计算属性值,并提供有关已更改的值的系统通知。 参与依赖属性系统的另一个关键类是 DependencyProperty。
DependencyProperty 允许将依赖属性注册到属性系统中,而 DependencyObject
作为基类,对象可以使用和设置依赖属性。
以下是 DependencyObject 提供或支持的一些值得注意的服务和特征:
- 依赖属性承载对现有Windows 运行时依赖属性的支持。
- 自定义依赖属性托管支持。 可以通过调用 Register 方法并将该方法的返回值存储为类中的
DependencyObject
公共静态属性来注册依赖属性。 - 附加属性承载对现有Windows 运行时附加属性的支持。
- 自定义附加属性托管支持。 通过调用 RegisterAttached 方法并将方法的返回值存储为类中的公共静态属性,可以注册附加属性用法的依赖属性。
-
Get
和Set
上存在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 线程与系统上运行的任何其他线程之间的有意分离。 公开 DispatcherQueue
TryEnqueue 方法以运行可等待代码。 由于它启用跨线程的访问, DependencyObject.DispatcherQueue
因此 是可从非 UI 线程访问且不引发跨线程异常的或其任何子类的唯一实例 API DependencyObject
。
DependencyObject
如果尝试从工作线程或任何其他非 UI 线程调用它们,则所有其他 API 都会引发异常。
通常可以在典型的 UI 代码中避免线程问题。 但是,设备通常不与 UI 线程关联。 如果使用从设备获取的信息来实时更新 UI,则通常必须获取 以便 DispatcherQueue
更新 UI。 另一种情况是,用于访问服务的代码可能不会在 UI 线程上运行。
一种代码方案:如果你正在定义自己的DependencyObject
类型并尝试将它们用于数据源,或者由于对象与 UI) 不直接相关,因此不一定适合 (,DependencyObject
则可能会遇到DependencyObject
与线程相关的问题。 例如,你可能正在尝试使用后台线程或其他工作线程进行性能优化,这些线程在演示之前或者为了响应设备、服务或其他外部输入而更改对象的值。 评估方案是否真的需要依赖属性;也许标准属性就足够了。
DependencyObject 派生类
DependencyObject
是多个直接派生类的父类,这些类都是用于应用及其 XAML UI 的编程模型的基础。 下面是一些值得注意的派生类:
- UIElement:可在 UI 中处理输入的大多数视觉对象的基类。 与 Control 一样,FrameworkElement 在此层次结构中更进一步,因此Windows 运行时中有数百个控件和其他类在其类层次结构中都有 UIElement 类。
- XAML 样式系统支持类: FrameworkTemplate (ControlTemplate、 DataTemplate、 ItemsPanelTemplate) 、 Style、 SetterBase (Setter) 、 ToolTipTemplateSettings 和其他 TemplateSettings 的父级。
- 视觉状态模型: Transition、 VisualState、 VisualStateGroup、 VisualStateManager、 VisualTransition。
- 数据绑定支持: BindingBase (Binding) 、 CollectionViewSource、 PropertyPath、 RelativeSource 的父级。
- 情节提要动画: 时间线 (Storyboard 的父级、类型化动画、主题动画) 、键入的关键帧 ((如 ColorKeyFrame) 、 KeySpline、 EasingFunctionBase)。
- XAML 图形和呈现基元: Brush、 Geometry、 GeneralTransform、 GradientStop、 PathFigure、 PathSegment、 Projection。
- 图像处理和呈现图面互操作: ImageSource (BitmapSource、 RenderTargetBitmap、 SurfaceImageSource 和其他) 的父级。
- 窗口:表示main应用窗口。
- FlyoutBase (浮出控件 和 MenuFlyout) 的父级。
- ResourceDictionary:在 XAML 中定义键控资源。
- TextElement: Block 和 Inline 的父级,这些元素又是用于 TextBlock 内容或富文本元素的文本元素的基类。
- AutomationPeer:Microsoft UI 自动化对等的基类,这些对等方表示 Microsoft UI 自动化 侦听器的 XAML 控件。 此外, IRawElementProviderSimple。
- 杂项: CacheMode、 ColumnDefinition、 DependencyObjectCollection、 InputScope、 InputScopeName、 PageStackEntry、 PrintDocument、 RowDefinition、 TriggerAction、 TriggerBase。
构造函数
DependencyObject() |
为 DependencyObject 派生类提供基类初始化行为。 |
属性
Dispatcher |
始终在Windows 应用 SDK应用中返回 |
DispatcherQueue |
|
方法
ClearValue(DependencyProperty) |
清除依赖属性的本地值。 |
GetAnimationBaseValue(DependencyProperty) |
返回为依赖属性建立的任何基值,该基值适用于动画未处于活动状态的情况。 |
GetValue(DependencyProperty) |
从 DependencyObject 返回依赖属性的当前有效值。 |
ReadLocalValue(DependencyProperty) |
如果设置了本地值,则返回依赖属性的本地值。 |
RegisterPropertyChangedCallback(DependencyProperty, DependencyPropertyChangedCallback) |
注册通知函数,用于侦听此 DependencyObject 实例上对特定 DependencyProperty 的更改。 |
SetValue(DependencyProperty, Object) |
设置 DependencyObject 上依赖属性的本地值。 |
UnregisterPropertyChangedCallback(DependencyProperty, Int64) |
取消以前通过调用 RegisterPropertyChangedCallback 注册的更改通知。 |