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