Как мне создать свой собственный класс Freezable? - PullRequest
5 голосов
/ 01 сентября 2011

Я пробовал MSDN, но нет примера для получения из Freezable.

Обновление:

Да, в MSDN есть пример с анимацией, но он слишком сложный. нужно что-то более простое, чтобы понять freezable.

Ответы [ 3 ]

13 голосов
/ 01 сентября 2011

Документация

В документации MSDN класса Freezable , в разделе Замечания , можно найти следующий абзац:

Информацию об использовании и создании собственных объектов Freezable см. В Обзор объектов Freezable .

Этот обзор содержит раздел Создание собственного класса Freezable , который содержит теоретические основы того, что вы хотите сделать. Чтобы найти пример, перейдите по ссылке внизу этого раздела:

Пример пользовательского класса Freezable см. Образец пользовательской анимации .


* +1025 * Пример

Поскольку вы специально запросили простой пример, вот один (адаптированный со страницы MSDN в Freezable.CreateInstanceCore ). Помните следующее предложение из страницы теории :

Каждый подкласс 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 голос
/ 01 сентября 2011

Что вы пробовали? В этой ссылке четко указано, что необходимо для наследования от абстрактного класса Freezable .

. Freezable является типом DependencyObject и поэтому использует свойство зависимости.система.Свойства вашего класса не обязательно должны быть свойствами зависимости, но использование свойств зависимости уменьшит объем кода, который вы должны написать, потому что класс Freezable был разработан с учетом свойств зависимости.Для получения дополнительной информации о системе свойств зависимостей см. Обзор свойств зависимостей.

Каждый подкласс Freezable должен переопределять метод CreateInstanceCore.Если ваш класс использует свойства зависимостей для всех своих данных, то вы закончили.

Если ваш класс содержит члены-данные свойств не зависимостей, вы также должны переопределить следующие методы:

  • CloneCore

  • CloneCurrentValueCore

  • GetAsFrozenCore

  • GetCurrentValueAsFrozenCore

  • FreezeCore

Необходимо также соблюдать следующие правила для доступа и записи в элементы данных, которые не являются свойствами зависимостей:

В начале любого APIкоторый читает члены данных свойства не зависимости, вызовите метод ReadPreamble.

В начале любого API, который записывает члены данных свойства не зависимости, вызовите метод WritePreamble.(После того как вы вызвали WritePreamble в API, вам не нужно делать дополнительный вызов ReadPreamble, если вы также читаете члены-данные свойств, не зависящих от зависимостей.)

Вызовите метод WritePostscript перед выходом из методов, которые пишутк элементам данных свойств вне зависимости.

Если ваш класс содержит элементы данных со свойством не зависимости, которые являются объектами DependencyObject, вы также должны вызывать метод OnFreezablePropertyChanged каждый раз, когда вы изменяете их значения, даже если вы 'переустанавливать элемент на ноль.

0 голосов
/ 01 сентября 2011
...