【发布时间】:2011-09-01 10:46:47
【问题描述】:
我尝试过 MSDN,但没有从 Freezable 派生的示例。
更新:
是的,在 MSDN 中有一个动画示例,但它太复杂了。 需要一些更简单的东西来理解可冻结。
【问题讨论】:
我尝试过 MSDN,但没有从 Freezable 派生的示例。
更新:
是的,在 MSDN 中有一个动画示例,但它太复杂了。 需要一些更简单的东西来理解可冻结。
【问题讨论】:
在MSDN documentation of the Freezable class的备注部分,您可以找到以下段落:
有关使用和创建您自己的 Freezable 对象的信息,请参阅Freezable Objects Overview。
本概述包含创建您自己的 Freezable 类部分,其中包含您想要做什么的理论背景。要查找示例,请点击该部分底部的链接:
有关自定义 Freezable 类的示例,请参阅Custom Animation Sample。
由于您特别要求一个简单的例子,这里有一个(改编自MSDN page of Freezable.CreateInstanceCore)。记住the theory page的下面这句话:
每个 Freezable 子类都必须重写 CreateInstanceCore 方法。如果您的类对其所有数据都使用依赖属性,那么您就完成了。
假设我们创建了一个自定义类MySimpleColor,它只有一个布尔属性IsRed。要使这个类可冻结,我们只需要覆盖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())完全按预期工作。
【讨论】:
你试过什么? This Link 明确说明需要从 abstract Freezable class 继承。
Freezable 是 DependencyObject 的一种,因此使用依赖属性系统。您的类属性不必是依赖属性,但使用依赖属性将减少您必须编写的代码量,因为 Freezable 类的设计考虑了依赖属性。有关依赖属性系统的更多信息,请参阅依赖属性概述。
每个 Freezable 子类都必须重写 CreateInstanceCore 方法。如果您的类对其所有数据都使用依赖属性,那么您就完成了。
如果您的类包含非依赖属性数据成员,您还必须重写以下方法:
克隆核心
CloneCurrentValueCore
GetAsFrozenCore
GetCurrentValueAsFrozenCore
FreezeCore
您还必须遵守以下规则来访问和写入非依赖属性的数据成员:
在任何读取非依赖属性数据成员的 API 开始时,调用 ReadPreamble 方法。
在任何写入非依赖属性数据成员的 API 开始时,调用 WritePreamble 方法。 (在 API 中调用 WritePreamble 后,如果您还读取非依赖属性数据成员,则无需额外调用 ReadPreamble。)
在退出写入非依赖属性数据成员的方法之前调用 WritePostscript 方法。
如果您的类包含属于 DependencyObject 对象的非依赖属性数据成员,则您还必须在每次更改其值时调用 OnFreezablePropertyChanged 方法,即使您将成员设置为 null。
【讨论】: