Чтение онлайн

ЖАНРЫ

Язык программирования C#9 и платформа .NET5
Шрифт:

Text="System.Windows.Controls.Button" />

<Button x:Name="btnTemplate" Content="See Template" BorderBrush="Green"

Height="40" Width="100" Margin="5" Click="btnTemplate_Click"

HorizontalAlignment="Left" />

<Border BorderBrush="DarkGreen" BorderThickness="2" Height="260"

Width="301" Margin="10" Background="LightGreen" >

<StackPanel x:Name="stackTemplatePanel" />

</Border>

</StackPanel>

</Border>

Добавьте

пустой обработчик события
btnTemplate_Click
:

private void btnTemplate_Click(

object sender, RoutedEventArgs e)

{

}

Текстовая область слева вверху позволяет вводить полностью заданное имя элемента управления WPF, расположенного в сборке

PresentationFramework.dll
. После того как библиотека загружена, экземпляр элемента управления динамически создается и отображается в большом квадрате слева внизу. Наконец, в текстовой области справа будет отображаться стандартный шаблон элемента управления. Добавьте в класс C# новую переменную-член типа
Control
:

private Control _ctrlToExamine=null;

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

System.Reflection.System.Xml
и
System.Windows.Markup
:

private void btnTemplate_Click(

object sender, RoutedEventArgs e)

{

_dataToShow="";

ShowTemplate;

txtDisplayArea.Text=_dataToShow;

}

private void ShowTemplate

{

// Удалить элемент, который в текущий момент находится

// в области предварительного просмотра.

if (_ctrlToExamine !=null)

stackTemplatePanel.Children.Remove(_ctrlToExamine);

try

{

// Загрузить PresentationFramework и создать экземпляр

// указанного элемента управления. Установить его размеры для

// отображения, а затем добавить в пустой контейнер StackPanel.

Assembly asm=Assembly.Load("PresentationFramework, Version=4.0.0.0," +

"Culture=neutral, PublicKeyToken=31bf3856ad364e35");

_ctrlToExamine=(Control)asm.CreateInstance(txtFullName.Text);

_ctrlToExamine.Height=200;

_ctrlToExamine.Width=200;

_ctrlToExamine.Margin=new Thickness(5);

stackTemplatePanel.Children.Add(_ctrlToExamine);

// Определить настройки XML для предохранения отступов.

var xmlSettings=new XmlWriterSettings{Indent=true};

// Создать объект StringBuilder для хранения разметки XAML.

var strBuilder=new StringBuilder;

// Создать объект XmlWriter на основе имеющихся настроек.

var xWriter=XmlWriter.Create(strBuilder, xmlSettings);

//
Сохранить разметку XAML в объекте XmlWriter на основе ControlTemplate.

XamlWriter.Save(_ctrlToExamine.Template, xWriter);

// Отобразить разметку XAML в текстовом поле.

_dataToShow=strBuilder.ToString;

}

catch (Exception ex)

{

_dataToShow=ex.Message;

}

}

Большая часть работы связана с отображением скомпилированного ресурса BAML на строку разметки XAML. На рис. 27.12 демонстрируется финальное приложение в действии на примере вывода стандартного шаблона для элемента управления

System.Windows.Controls.DatePicker
. Здесь отображается календарь, который доступен по щелчку на кнопке в правой части элемента управления.

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

Построение шаблона элемента управления с помощью инфраструктуры триггеров

Специальный шаблон для элемента управления можно создавать с помощью только кода С#. Такой подход предусматривает добавление данных к объекту

ControlTemplate
и затем присваивание его свойству
Template
элемента управления. Однако большую часть времени внешний вид и поведение
ControlTemplate
будут определяться с использованием разметки XAML и фрагментов кода (мелких или крупных) для управления поведением во время выполнения.

В оставшемся материале главы вы узнаете, как строить специальные шаблоны с применением Visual Studio. Попутно вы ознакомитесь с инфраструктурой триггеров WPF и научитесь использовать анимацию для встраивания визуальных подсказок конечным пользователям. Применение при построении сложных шаблонов только IDE-среды Visual Studio может быть связано с довольно большим объемом клавиатурного набора и трудной работы. Конечно, шаблоны производственного уровня получат преимущество от использования продукта Blend, устанавливаемого вместе с Visual Studio. Тем не менее, поскольку текущее издание книги не включает описание Blend, время засучить рукава и приступить к написанию некоторой разметки.

Для начала создайте новый проект приложения WPF по имени

ButtonTemplate
. Основной интерес в данном проекте представляют механизмы создания и применения шаблонов, так что замените элемент
Grid
следующей разметкой:

<StackPanel Orientation="Horizontal">

<Button x:Name="myButton" Width="100" Height="100" Click="myButton_Click"/>

</StackPanel>

В обработчике события

Click
просто отображается окно сообщения (посредством вызова
MessageBox.Show
) с подтверждением щелчка на элементе управления. При построении специальных шаблонов помните, что поведение элемента управления неизменно, но его внешний вид может варьироваться.

Поделиться с друзьями: