我已经尝试过 MSDN,但没有从 Freezable 派生的示例。
更新:
是的,在 MSDN 中有一个动画示例,但它太复杂了。需要一些更简单的东西来理解可冻结的。
在Freezable 类的 MSDN 文档中,在Remarks部分中,您可以找到以下段落:
有关使用和创建您自己的 Freezable 对象的信息,请参阅Freezable 对象概述。
此概述包含创建您自己的 Freezable 类的部分,其中包含您想要做的事情的理论背景。要查找示例,请点击该部分底部的链接:
有关自定义 Freezable 类的示例,请参阅自定义动画示例。
由于您特别要求一个简单的示例,因此这里是一个(改编自Freezable.CreateInstanceCore 的 MSDN 页面)。记住理论页面中的以下句子:
每个 Freezable 子类都必须重写 CreateInstanceCore 方法。如果您的类对其所有数据使用依赖属性,那么您就完成了。
假设我们创建了一个自定义类MySimpleColor
,它只有一个布尔属性IsRed
。要使此类 Freezable,我们只需要覆盖CreateInstanceCore
:
public class MySimpleColor : Freezable
{
// Here are your properties
public static readonly DependencyProperty IsRedProperty =
DependencyProperty.Register("IsRed", typeof(Boolean), typeof(MySimpleColor));
// CLR accessor of your property
public bool IsRed {
get { return (bool)GetValue(IsRedProperty); }
set { SetValue(IsRedProperty, value); }
}
// All that's needed to make this Freezable
protected override Freezable CreateInstanceCore() {
return new MySimpleColor();
}
}
就是这样。继承自的代码Freezable
确保Freezable
方法如Freeze()
或Clone()
完全按预期工作。
你试过什么? 此链接清楚地说明了从抽象 Freezable 类继承所需的内容。
Freezable 是 DependencyObject 的一种,因此使用依赖属性系统。您的类属性不必是依赖属性,但使用依赖属性将减少您必须编写的代码量,因为 Freezable 类的设计考虑了依赖属性。有关依赖属性系统的更多信息,请参阅依赖属性概述。
每个 Freezable 子类都必须重写 CreateInstanceCore 方法。如果您的类对其所有数据使用依赖属性,那么您就完成了。
如果您的类包含非依赖属性数据成员,您还必须重写以下方法:
克隆核心
克隆当前值核心
GetAsFrozenCore
GetCurrentValueAsFrozenCore
冻结核心
您还必须遵守以下规则来访问和写入不是依赖属性的数据成员:
在任何读取非依赖属性数据成员的 API 开始时,调用 ReadPreamble 方法。
在写入非依赖属性数据成员的任何 API 的开头,调用 WritePreamble 方法。(在 API 中调用 WritePreamble 后,如果您还读取了非依赖属性数据成员,则无需额外调用 ReadPreamble。)
在退出写入非依赖属性数据成员的方法之前调用 WritePostscript 方法。
如果您的类包含作为 DependencyObject 对象的非依赖属性数据成员,则您还必须在每次更改它们的值时调用 OnFreezablePropertyChanged 方法,即使您将该成员设置为 null。
检查可冻结对象概述,您可以在文章末尾 找到示例