5

我已经尝试过 MSDN,但没有从 Freezable 派生的示例。

更新:

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

4

3 回答 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确保Freezable方法如Freeze()Clone()完全按预期工作。

于 2011-09-01T10:52:30.983 回答
1

你试过什么? 此链接清楚地说明了从抽象 Freezable 类继承所需的内容。

Freezable 是 DependencyObject 的一种,因此使用依赖属性系统。您的类属性不必是依赖属性,但使用依赖属性将减少您必须编写的代码量,因为 Freezable 类的设计考虑了依赖属性。有关依赖属性系统的更多信息,请参阅依赖属性概述。

每个 Freezable 子类都必须重写 CreateInstanceCore 方法。如果您的类对其所有数据使用依赖属性,那么您就完成了。

如果您的类包含非依赖属性数据成员,您还必须重写以下方法:

  • 克隆核心

  • 克隆当前值核心

  • GetAsFrozenCore

  • GetCurrentValueAsFrozenCore

  • 冻结核心

您还必须遵守以下规则来访问和写入不是依赖属性的数据成员:

在任何读取非依赖属性数据成员的 API 开始时,调用 ReadPreamble 方法。

在写入非依赖属性数据成员的任何 API 的开头,调用 WritePreamble 方法。(在 API 中调用 WritePreamble 后,如果您还读取了非依赖属性数据成员,则无需额外调用 ReadPreamble。)

在退出写入非依赖属性数据成员的方法之前调用 WritePostscript 方法。

如果您的类包含作为 DependencyObject 对象的非依赖属性数据成员,则您还必须在每次更改它们的值时调用 OnFreezablePropertyChanged 方法,即使您将该成员设置为 null。

于 2011-09-01T10:52:54.497 回答
0

检查可冻结对象概述,您可以在文章末尾 找到示例

于 2011-09-01T10:54:29.897 回答