Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю
На нашем сайте KnigaRead.com Вы можете абсолютно бесплатно читать книгу онлайн Троелсен Эндрю, "Язык программирования C#9 и платформа .NET5" бесплатно, без регистрации.
<b>// FrameworkElement "является" DependencyObject.</b>
public class FrameworkElement : UIElement, IFrameworkInputElement,
IInputElement, ISupportInitialize, IHaveResources, IQueryAmbient
{
...
<b> // Статическое поле только для чтения типа DependencyProperty.</b>
public static readonly DependencyProperty HeightProperty;
<b> // Поле DependencyProperty часто регистрируется</b>
<b> // в статическом конструкторе класса.</b>
static FrameworkElement()
{
...
HeightProperty = DependencyProperty.Register(
"Height",
typeof(double),
typeof(FrameworkElement),
new FrameworkPropertyMetadata((double) 1.0 / (double) 0.0,
FrameworkPropertyMetadataOptions.AffectsMeasure,
new PropertyChangedCallback(FrameworkElement.OnTransformDirty)),
new ValidateValueCallback(FrameworkElement.IsWidthHeightValid));
}
<b> // Оболочка CLR, реализованная с использованием</b>
<b> // унаследованных методов GetValue()/SetValue().</b>
public double Height
{
get { return (double) base.GetValue(HeightProperty); }
set { base.SetValue(HeightProperty, value); }
}
}
Как видите, по сравнению с обычными свойствами CLR свойства зависимости требуют немалого объема дополнительного кода. В реальности зависимость может оказаться даже еще более сложной, чем показано здесь (к счастью, многие реализации проще свойства
Height
В первую очередь вспомните, что если в классе необходимо определить свойство зависимости, то он должен иметь в своей цепочке наследования
DependencyObject
GetValue()
SetValue()
FrameworkElement
DependencyObject
Далее вспомните, что сущность, где действительно хранится значение свойства (значение
double
Height
DependencyProperty
Property
public static readonly DependencyProperty HeightProperty;
Учитывая, что свойства зависимости объявляются как статические поля, они обычно создаются (и регистрируются) внутри статического конструктора класса. Объект
DependencyProperty
DependencyProperty.Register()
Height
HeightProperty = DependencyProperty.Register(
"Height",
typeof(double),
typeof(FrameworkElement),
new FrameworkPropertyMetadata((double)0.0,
FrameworkPropertyMetadataOptions.AffectsMeasure,
new PropertyChangedCallback(FrameworkElement.OnTransformDirty)),
new ValidateValueCallback(FrameworkElement.IsWidthHeightValid));
Первым аргументом, передаваемым методу
DependencyProperty.Register()
Height
double
FrameworkElement
HeightProperty
FrameworkElement
Четвертый аргумент, передаваемый методу
DependencyProperty.Register()
FrameworkPropertyMetadata
FrameworkPropertyMetadata
FrameworkPropertyMetadataOptions
FrameworkPropertyMetadata
new FrameworkPropertyMetadata(
// Стандартное значение свойства.
(double)0.0,
// Параметры метаданных.
FrameworkPropertyMetadataOptions.AffectsMeasure,
// Делегат, который указывает на метод,
// вызываемый при изменении свойства.