我尝试过MSDN,但没有从Freezable派生的例子。
更新
是的,在MSDN中有一个动画示例,但它太复杂了。 需要更简单易懂的东西。
答案 0 :(得分:13)
在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
。要将此类设为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()
方法完全按预期工作。
答案 1 :(得分:1)
你有什么尝试? This Link明确说明了从abstract Freezable class继承所需的内容。
Freezable是一种DependencyObject,因此使用依赖属性系统。您的类属性不必是依赖项属性,但使用依赖项属性将减少您必须编写的代码量,因为Freezable类在设计时考虑了依赖项属性。有关依赖项属性系统的更多信息,请参阅依赖项属性概述。
每个Freezable子类都必须覆盖CreateInstanceCore方法。如果您的类对其所有数据使用依赖项属性,那么您已完成。
如果您的类包含非依赖项属性数据成员,则还必须覆盖以下方法:
CloneCore
CloneCurrentValueCore
GetAsFrozenCore
GetCurrentValueAsFrozenCore
FreezeCore
您还必须遵守以下规则来访问和写入非依赖项属性的数据成员:
在任何读取非依赖项属性数据成员的API的开头,调用ReadPreamble方法。
在编写非依赖项属性数据成员的任何API的开头,调用WritePreamble方法。 (一旦你在API中调用WritePreamble,如果你还读取了非依赖属性数据成员,则不需要再调用ReadPreamble。)
在退出写入非依赖项属性数据成员的方法之前调用WritePostscript方法。
如果您的类包含作为DependencyObject对象的非依赖项属性数据成员,则每次更改其值时,还必须调用OnFreezablePropertyChanged方法,即使您将该成员设置为null也是如此。
答案 2 :(得分:0)