Причина в том, что стандартные свойства элемента управления (такие как BackGround
и Content
) переопределяются в шаблоне. Чтобы они стали доступными, их потребуется отобразить на связанные свойства в шаблоне. Решить такие проблемы можно за счет использования расширения разметки {TemplateBinding}
при построении шаблона. Оно позволяет захватывать настройки свойств, которые определены элементом управления, применяющим шаблон, и использовать их при установке значений в самом шаблоне.
Ниже приведена переделанная версия шаблона RoundButtonTemplate
, в которой расширение разметки {TemplateBinding}
применяется для отображения свойства Background
элемента Button
на свойство Fill
элемента Ellipse
; здесь также обеспечивается действительная передача значения Content
элемента Button
свойству Content
элемента Label
:
FontSize="20" FontWeight="Bold" HorizontalAlignment="Center"
VerticalAlignment="Center" />
После такого обновления появляется возможность создания кнопок с разными цветами и текстом. Результат обновления разметки XAML представлен на рис.27.13.
Роль класса ContentPresenter
При проектировании шаблона для отображения текстового значения элемента управления использовался элемент Label
. Подобно Button
он поддерживает свойство Content
. Следовательно, если применяется расширение разметки {TemplateBinding}
, тогда можно определять элемент Button
со сложным содержимым, а не только с простой строкой.
Но что, если необходимо передать сложное содержимое члену шаблона, который Content
? Когда в шаблоне требуется определить обобщенную Label
или TextBox
) можно использовать класс ContentPresenter
. Хотя в рассматриваемом примере в этом нет нужды, ниже показана простая разметка, иллюстрирующая способ построения специального шаблона, который применяет класс ContentPresenter
для отображения значения свойства Content
элемента управления, использующего шаблон:
Встраивание шаблонов в стили
В данный момент наш шаблон просто определяет базовый внешний вид и поведение элемента управления Button
. Тем не менее, за процесс установки базовых свойств элемента управления (содержимого, размера шрифта, веса шрифта и т.д.) отвечает сам элемент Button
:
FontWeight="Bold"
Template="{StaticResource RoundButtonTemplate}"
Click="myButton_Click"/>
При желании значения базовых свойств можно устанавливать в App.xaml
, которому назначен ключ RoundButtonSyle
:
После такого обновления кнопочные элементы управления можно создавать с установкой свойства Style
следующим образом:
Click="myButton_Click" Style="{StaticResource RoundButtonStyle}"/>
Несмотря на то что внешний вид и поведение кнопки остаются такими же, преимущество внедрения шаблонов внутрь стилей связано с тем, что появляется возможность предоставить готовый набор значений для общих свойств. На этом обзор применения Visual Studio и инфраструктуры триггеров при построении специальных шаблонов для элемента управления завершен. Хотя об инфраструктуре WPF можно еще много чего сказать, теперь у вас имеется хороший фундамент для дальнейшего самостоятельного изучения.
Резюме
Первой в главе рассматривалась система управления ресурсами WPF. Мы начали с исследования работы с двоичными ресурсами и роли объектных ресурсов. Вы узнали, что объектные ресурсы представляют собой именованные фрагменты разметки XAML, которые могут быть сохранены в разнообразных местах с целью многократного использования содержимого.
Затем был описан API-интерфейс анимации WPF. В приведенных примерах анимация создавалась с помощью кода С#, а также посредством разметки XAML. Для управления выполнением анимации, определенной в разметке, применяются элементы Storyboard
и триггеры. Далее был продемонстрирован механизм стилей WPF, который интенсивно использует графику, объектные ресурсы и анимацию.
Бьерн Страуструп , Бьёрн Страуструп , Валерий Федорович Альмухаметов , Ирина Сергеевна Козлова
Программирование, программы, базы данных / Базы данных / Программирование / Учебная и научная литература / Образование и наука / Книги по IT