如何创建自己的Freezable类?

时间:2011-09-01 10:46:47

标签: wpf freezable

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

更新

是的,在MSDN中有一个动画示例,但它太复杂了。 需要更简单易懂的东西。

3 个答案:

答案 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继承的代码可确保FreezableFreeze()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)