如何创建自己的可冻结类(Freezable class)?

5

我已经尝试了MSDN,但是没有一个继承自Freezable的示例。

更新:

是的,在MSDN中有一个动画示例,但它太复杂了,需要一些更简单的东西来理解Freezable。

3个回答

13

文档

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继承的代码确保Freeze()Clone()Freezable方法按照预期工作。


我在这个问题上给你点赞,因为这完全回答了问题。 - user604613

1
你尝试过什么? 这个链接清楚地说明了从抽象Freezable类继承所需的内容。
Freezable是DependencyObject类型,因此使用依赖属性系统。您的类属性不必是依赖属性,但使用依赖属性将减少您需要编写的代码量,因为Freezable类是专为依赖属性设计的。有关依赖属性系统的更多信息,请参阅“依赖属性概述”。
每个Freezable子类都必须重写CreateInstanceCore方法。如果您的类对所有数据使用依赖属性,则完成了。
如果您的类包含非依赖属性数据成员,则还必须重写以下方法:
- CloneCore - CloneCurrentValueCore - GetAsFrozenCore - GetCurrentValueAsFrozenCore - FreezeCore 您还必须遵守访问和写入非依赖属性数据成员的以下规则:
在读取非依赖属性数据成员的任何API的开头,调用ReadPreamble方法。
在写入非依赖属性数据成员的任何API的开头,调用WritePreamble方法。(一旦您在API中调用了WritePreamble,如果您还读取非依赖属性数据成员,则无需再次调用ReadPreamble。)
在退出写入非依赖属性数据成员的方法之前,调用WritePostscript方法。
如果您的类包含非依赖属性数据成员,这些数据成员是DependencyObject对象,则每次更改其值时,即使将成员设置为null,也必须调用OnFreezablePropertyChanged方法。

@Erez,你所寻找的一切都在那个页面上。另外,在那个页面上还有一个示例链接(正如其他人在他们的回答中已经指出的那样)http://go.microsoft.com/fwlink/?LinkID=159981是实际下载此示例的链接。 - user604613

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接