Документ 5017383

реклама
Александр Шер
Разработчик
ООО «Айко»
Microsoft TechDays
http://www.techdays.ru
Styles
Templates
Взаимодействие CustomControl с темплейтом
Templates VS UserControls
Microsoft TechDays
http://www.techdays.ru
Стиль – это набор ресурсов, значений свойств,
обработчиков событий и триггеров
С помощью стилей можно менять значения
любого не-ReadOnly DependencyProperty
Можно задать базовый тип контрола, к
которому он применяем
Тип проверяется на этапе компиляции
Тип должен быть классом
Тип можно указать для отдельного свойста
На этапе исполнения имеет значение только
свойство
Microsoft TechDays
http://www.techdays.ru
Стиль, добавленный в Resources без ключа,
применяется ко всем контролам типа,
заданного в TargetType
Ключом неявно становится тип из TargetType
Стиль, добавленный без ключа в Resources
дочернего контрола, перекрывает стиль в
родителе
Наследование не происходит, если не указать явно
Стиль не применяется к экземплярам потомков
Microsoft TechDays
http://www.techdays.ru
Механизм наследования стилей позволяет
переопределять значения свойств и добалять
триггеры и обработчики событий
Стили можно наследовать от неявно заданных
Стиль-предок определяется контекстом
Стиль-потомок может иметь такие-же или
более жесткие требования относительно типа
контрола
Но не может более мягкие – проверяется на этапе
компиляции
Microsoft TechDays
http://www.techdays.ru
Неявно применяемый
стиль из словаря
Неявно применяемый
стиль
Базовый стиль
Неявно применяемый
в дочернем контроле
стиль
Явно приминяемый
стиль
Явно применяемый
стиль с нестрогой
типизацией
Неявно применяемый
в потомке стиль с
указанием
наследования
Явно приминяемый
стиль – наследник
Microsoft TechDays
http://www.techdays.ru
ControlTemplate
Предназначен для определения внешнего вида
контрола
Позволяет указывать тип контрола
Binding.Source – DataContext контрола
DataTemplate
Предназначен для определения вида контента
Позволяет указывать тип контента для неявного
выбора темплейта
Binding.Source – Content
ItemsPanelTemplate
Предназначен для указания панели в ItemsControl
Microsoft TechDays
http://www.techdays.ru
Binding
Source – ресурс или статическое поле
RelativeSource – ссылка на
контрол, к которому применяется темплейт
родительский контрол указанного типа,
предыдущий dataItem
себя
ElementName – ссылка на элемент по имени
MultiBinding
Получение данных из нескольких источников и
обработка с помощью конвертера
PriorityBinding
Используется первый «сработавший» биндинг
Microsoft TechDays
http://www.techdays.ru
Селекторы применяются в случаях, когда
требуется полностью изменить темплейт в
зависимости от каких-либо условий
Предпосылки к исползованию
Сложная логика выбора темплейта
Повторное использование
Иногда использование триггеров оказывается
удобнее селекторов
Если определен DataTemplate, то
DataTemplateSelector игнорируется
Microsoft TechDays
http://www.techdays.ru
Темплейты не поддерживают наследование
(очевидно :-)
Темплейты можно вкладывать друг в друга,
применяя одни темплейты внутри других
Для вложенного ControlTemplate должен
удовлетворять TargetType
Microsoft TechDays
http://www.techdays.ru
С помощью именованных частей
Ссылки на части должны обновляться каждый раз
при смене темплейта
Контрол должен работать, даже если какие-то из
частей не найдены!
С помощью механизма RoutedCommands
Команда может прийти от контрола вне темплейта
Команда может быть пораждена нажатием
комбинации клавиш
Microsoft TechDays
http://www.techdays.ru
Минимизируйте контракт!
Не опирайтесь на взаимное расположение
контролов
Используйте DependencyProperty, помогающие
определять состояние контрола
(CheckBox.IsChecked)
Используйте Attached Properties, чтобы дать
возможность изменять поведение контрола без
изменения темплейта родителя
(ScrollViewer.CanContentScroll)
Microsoft TechDays
http://www.techdays.ru
CustomControl + Template
+
+
+
−
−
Логика отделена от представления
Представление полностью кастумизируется
Покрытие логики юнит-тестами
Сложнее в разработке
Требуется обработка смены темплейта
UserControl
+
+
+
−
−
−
Доступ к обработчикам событий из XAML
Простая реализация
Content по-прежнему можно кастумизировать
Не позволяет кастумизировать сам контрол
Создание иерархии контролов затруднительно
Для тестирования требуются AutomationPeers
Microsoft TechDays
http://www.techdays.ru
Выносите все повторяющиеся «настройки» в
стили
Не прописывайте в ControlTemplate значения
свойств, которые могут быть получены из стиля
Пропишите в ControlTemplate ссылку на свойство
через TemplateBinding
Заведите стиль и задайте значение для свойства
через сеттер
Используйте триггеры стилей для изменения
свойств контрола
Используйте триггеры темплейтов для
изменения частей темплейта
Microsoft TechDays
http://www.techdays.ru
Раздел, посвященный WPF в MSDN:
http://msdn.microsoft.com/wpf
WPF на CodePlex:
http://www.codeplex.com/wpf
http://www.codeplex.com/3DTools
Собрание блоггеров (Dr. WPF, John Smith,
Beatriz Costa, etc.):
http://wpfdisciples.wordpress.com/
Microsoft TechDays
http://www.techdays.ru
Microsoft TechDays
http://www.techdays.ru
Скачать