Александр Шер Разработчик ООО «Айко» 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