Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Программирование на C# для чайников


Windows Presentation Foundation (WPF). Урок 3. Свойства объектов XAML.

Поместив на форму WPF приложения кнопочку:

Windows Presentation Foundation (WPF). Урок 3. Свойства объектов XAML.

Мы видим, что у нее есть например, такие свойства, как HorizontalAlignment, в XAML они задаются строкой, но в .NET свойство HorizontalAlignment элемента Button вовсе не строка, это enum. Иными словами, анализатору XAML приходиться конвертировать типы свойств. При этом он выполняет следующие действия:

  • Проверяет объявление свойства на наличие атрибута TypeConverter. Если находит то использует для конвертации класс, на который указывает это свойство.

  • Если такого атрибута нет, то анализатор XAML проверяет объявление класса соответствующего типа данных.
  • Если и после этого конвертор типов не найден, то анализатор генерирует сообщение об ошибке.

Однако конверторы свойств подходят не для всех сценариев.  В частности, некоторые свойства являются полноценными объектами с собственными наборами свойств. Можно, конечно, создать строковое представление объектов, но это неудобно и повышает вероятность ошибки. К счастью есть синтаксис "Свойство.Элемент". Суть этого синтаксиса состоит в том, что у свойств можно задавать отдельные элементы "через точку". Например для того что бы задать свойство Background у элемента Grid  можно использовать Grid.Background, вот пример синтаксиса задания этого свойства:

    <Grid>

        <Grid.Background>

            <LinearGradientBrush>

                <LinearGradientBrush.GradientStops>

                    <GradientStop Offset="0.0" Color="Red"/>

                    <GradientStop Offset="0.5" Color="Indigo"/>

                    <GradientStop Offset="1.5" Color="Violet"/>

                </LinearGradientBrush.GradientStops>

            </LinearGradientBrush>

        </Grid.Background>

        <Button Content="Кнопка" Height="23" HorizontalAlignment="Left" Margin="88,41,0,0" Name="MyButton" VerticalAlignment="Top" Width="75" />

    </Grid>

Вот к какому эффекту приведет данный синтаксис:

Windows Presentation Foundation (WPF). Урок 3. Свойства объектов XAML.

Это же самое можно сделать и программно. Но мы напишем программный код для другой заливки и поместим его в обработчик нажатия кнопочки "Кнопка":

        private void MyButton_Click(object sender, RoutedEventArgs e)

        {

            LinearGradientBrush brush = new LinearGradientBrush();

 

            GradientStop stop = new GradientStop();

            stop.Offset = 0;

            stop.Color = Colors.Yellow;

            brush.GradientStops.Add(stop);

 

            stop = new GradientStop();

            stop.Offset = 0.2;

            stop.Color = Colors.Green;

            brush.GradientStops.Add(stop);

 

            stop = new GradientStop();

            stop.Offset = 1.2;

            stop.Color = Colors.Red;

            brush.GradientStops.Add(stop);

 

            grid1.Background = brush;

        }

Задам имя объекта Grid:

Windows Presentation Foundation (WPF). Урок 3. Свойства объектов XAML.

и запустим программу на тестирование. Сначала у нас окно имеет вот такой вид:

Windows Presentation Foundation (WPF). Урок 3. Свойства объектов XAML.

а при нажатии на кнопочку уже вот такой:

Windows Presentation Foundation (WPF). Урок 3. Свойства объектов XAML.

Бывают случаи, когда невозможно жестко закодировать значение свойства. Например, когда значение свойства должно быть установлено в уже существующий объект или значение свойства надо установить динамически, например, привязав его к свойству в другом элементе управления. В таких случаях используется специальный синтаксис, называемый расширение разметки.

Вот так вот например, можно ссылаться на статическое свойство другого класса (синтаксис выделен серым):

<Button Content="Кнопка" Height="23" HorizontalAlignment="Left" Margin="88,41,0,0" Name="MyButton" VerticalAlignment="Top" Width="75" Click="MyButton_Click" Foreground="{x:Static SystemColors.ActiveCaptionBrush}"></Button>

В данном случае мы цвет текста на кнопке задаем как значение SystemColors.ActiveCaptionBrush. Вот к какому эффекту это приведет:

Windows Presentation Foundation (WPF). Урок 3. Свойства объектов XAML.

Данный синтаксис эквивалентен следующему коду:

MyButton.Foreground = SystemColors.ActiveCaptionBrush;

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

Все расширения разметки реализованы классами, ддочерними от  System.Windows.Markup.MarkupExtension. Этот класс содержит всего один метод ProvideValue.

Напоследок я расскажу о таком понятии, как присоединенные свойства. Это такие свойства, которые применяются к нескольким элементам управления, но определны в другом классе. В WPF такие свойства часто используются для управления компоновкой. Что бы было более понятно, продемонстрирую это на примере. и так, давайте у объекта Grid сделаем пару строчек и пару столбцов (свойства ColumnDefinitions и RowDefinitions):

Windows Presentation Foundation (WPF). Урок 3. Свойства объектов XAML.

Для этого просто жмем на кнопочку с тремя точками, что бы вызвать окно редактирования коллекции:

Windows Presentation Foundation (WPF). Урок 3. Свойства объектов XAML.

У нас появиться сетка, куда мы можем поместить элементы управления:

Windows Presentation Foundation (WPF). Урок 3. Свойства объектов XAML.

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

Windows Presentation Foundation (WPF). Урок 3. Свойства объектов XAML.

Эти свойства именно поэтому называются присоединенными, потому что они появляются у компонента только лишь при определенных условиях, например, когда его помещают в контейнер. Нетрудно догадаться, для чего нужны такие свойства - дело в том, что в разных ситуациях нужны совершенно разные дополнительные свойства и нет нужны нагружать компонент целым рядом редко используемых свойств.

Так же эти свойства видны в диспетчере свойств:

Windows Presentation Foundation (WPF). Урок 3. Свойства объектов XAML.

Установку дополнительных свойств можно делать и программно, например, так:

        private void button1_Click(object sender, RoutedEventArgs e)

        {

            Grid.SetRow(button2, 0);

        }

Вот у нас кнопочка button1:

Windows Presentation Foundation (WPF). Урок 3. Свойства объектов XAML.

А вот button2:

Windows Presentation Foundation (WPF). Урок 3. Свойства объектов XAML.

нажимаем на button1, и button2 у нас смещается в другую ячейку сетки:

Windows Presentation Foundation (WPF). Урок 3. Свойства объектов XAML.

Тот же самый эффект мы получим если запишем код в таком виде:

        private void button1_Click(object sender, RoutedEventArgs e)

        {

             button2.SetValue(Grid.RowProperty, 0);

        }

На этом урок окончен, до новых встреч.

 

 


В избранное