【问题标题】:How do I create my own Freezable class?如何创建自己的 Freezable 类?
【发布时间】:2011-09-01 10:46:47
【问题描述】:

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

更新:

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

【问题讨论】:

    标签: wpf freezable


    【解决方案1】:

    文档

    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())完全按预期工作。

    【讨论】:

    • 我对此表示赞同,因为这完全回答了问题
    【解决方案2】:

    你试过什么? 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。

    【讨论】:

    • @Erez 您所寻找的一切都在该页面上。还有一个链接在该页面上的示例(正如其他人已经在他们的答案中指出的那样)go.microsoft.com/fwlink/?LinkID=159981 是此示例的实际下载链接
    【解决方案3】:

    【讨论】:

      猜你喜欢
      • 2021-07-28
      • 1970-01-01
      • 2011-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多