Конвертеры типов и элементы свойств

Конвертеры типов (type converter) в WPF — это специальные объекты, которые преобразовывают значения строк из кода XAML к тем типам свойств объектов, которые используются в коде C#.

Конвертеры типов

Рассмотрим следующий код XAML

<Button Content="Нажми меня" Width="200" Height="60" Background="Blue" VerticalAlignment="Bottom" Margin="5,5,5,5" Click="Button_Click" x:Name="button"/>

Здесь у нас определена кнопка, у которой, в свою очередь определены свойства Content, Width, Height, Background, VerticalAlignment, а также свойство Name и обработчик события Click. Код C#, с помощью которого можно создать такую кнопку выглядел бы следующим образом:

Button button = new Button();
button.Content = "Нажми меня";
button.Background = Brushes.Blue;
button.Width = 200;
button.Height = 60;
button.VerticalAlignment = VerticalAlignment.Bottom;
button.Margin = new Thickness(5, 5, 5, 5);
button.Click += new RoutedEventHandler(Button_Click);

Обратите внимание на такие атрибуты элемента Button, как Margin, VerticalAlignment и Background. Так, атрибуту Margin в коде C# соответствует объект класса Thickness, а атрибуту Background соответствует статическому полю System.Windows.Media.Brushes.White (типа System.Windows.Media.SolidColorBrush). Для того, чтобы такая «магия» была возможна, в WPF и используются специальные конвертеры типов.

WPF предоставляет конвертеры типов для многих часто используемых типов данных: Brush, Color, FontWeight, Point и т.д. Все это — классы-наследники от TypeConverter (BrushConverter, ColorConverter и т.д.) и, если нам потребуется, то мы можем написать собственный конвертер для произвольного типа данных.

Как ищутся конвертеры типов

Для того, чтобы найти подходящий для свойства конвертер типа компилятор или анализатор XAML смотрит, снабжено ли определение данного свойства или определение типа данных этого свойства атрибутом System.ComponentModel.TypeConverterAttribute.

Например, при установке свойства Background кнопки Button в XAML-коде применяется конвертер типа BrushConverter, поскольку свойство Background имеет тип System.Windows.Media.Brush, в определении которого задан следующий атрибут:

[TypeConverter(typeof(BrushConverter)), …]
public abstract class Brush : …
{
...
}

Элементы свойств

До сих пор мы задавали все свойства элементов в виде атрибутов. При этом XAML дает нам возможность определять свойства через элементы свойств. Например, вернемся к нашему свойству Background . Мы могли бы его определить следующим образом:

<Button Content="Нажми меня" Width="200" Height="60" VerticalAlignment="Bottom" Margin="5,5,5,5" Click="Button_Click" x:Name="button">
    <Button.Background>
        <SolidColorBrush Opacity="0.5" Color="Blue"/>
    </Button.Background>
</Button>

здесь Button.Background — это элемент свойства. Так, с использованием элементов свойств мы можем задавать элементам управления более сложные свойства, например, как в коде выше — определить прозрачность. Элементы свойств всегда имеют вид ИмяТипа.ИмяСвойства и обязательно вложены в объектный элемент вида ИмяТипа. У элементов свойств не может быть собственных атрибутов (за одним исключением — атрибут х:Uid используется для локализации).

Используя же конвертер типа BrushConverter мы могли бы задать свойство Background даже вот таким странным, на первый взгляд, образом:

<Button Content="Нажми меня" Width="200" Height="60" VerticalAlignment="Bottom" Margin="5,5,5,5" Click="Button_Click" x:Name="button">
    <Button.Background>
        Blue
    </Button.Background>
</Button>

Здесь значение свойства задано обычной строкой, а наличие конвертера типа позволят преобразовать эту строку в необходимый нам тип.

Итого

Конвертеры типов (type converter) в WPF — это специальные объекты, которые преобразовывают значения строк из кода XAML к тем типам свойств объектов, которые используются в коде C#. Если нам необходимо определить значения какого-либо сложного свойства, то мы можем воспользоваться элементами свойств, например, чтобы указать не только цвет заливки, но и прозрачность.

Подписаться
Уведомить о
guest
0 Комментарий
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии