220 likes | 396 Views
Использование возможностей декларативного подхода в реальных проектах. Александр Шер Разработчик ООО «Айко». О чем пойдет речь?. Зачем WPF и XAML разработчику? Styles & Templates Bindings RoutedEvents & InputBindings Triggers – управление представлением Практические заметки.
E N D
Использование возможностей декларативного подхода в реальных проектах Александр Шер Разработчик ООО «Айко»
О чем пойдет речь? • Зачем WPF и XAML разработчику? • Styles & Templates • Bindings • RoutedEvents & InputBindings • Triggers – управление представлением • Практические заметки
«Бытовое» мнение о WPF(или почему так мало WPF-приложений) • WPF для тех, кому нужна излинше навороченная графика • Все это жудко тормозит • Нет никакого дизайнера форм, а Blend надо покупать отдельно • Стандартных контролов мало, а контролы третьих фирм надо для WPF покупать заново • А что мне дает WPF как разработчику?
«WPF для тех, кому нужна излинше навороченная графика» • WPF предоставляет очень много возможностей для создания пользовательских интерфейсов (Представление != Графика) • Какие из них использовать – решать Вам! • Большинство пользователей любит красивые приложения
«Все это жудко тормозит» • WinFormsпорождает отдельный handle для каждого элемента управленияв окне, а WPF использует всего один* – само окно • WPF умеет использовать 3D-ускоритель • Бизнес приложение не требует графики уровня 3D-шутера • Пример из жизни: приложение iiko Front для кассовых терминалов создано на WPF иработает на компьютерах с 1ГГц проц и 256Мб памяти
«Нет никакого дизайнера форм, а Blend надо покупать отдельно» • В сложных приложениях дизайнер WinFormsвсе равно со временем «отваливается» • WPF позволяет легко создавать пользовательские интерфейсы без дизайнера • Blend входитв MSDN Premium, а «коробка» стоит меньше 100$
«Стандартных контролов мало, а контролы третьих фирм надо для WPF покупать заново» • В WPF логика контрола полностью отделена от представления • Во многих случаях в отдельном контроле нет необходимости – достаточно настроить Template • Чарты, гриды и красивые элементы управления легко создаются в WPF стандартными средствами • DataGridи Calendar уже есть (http://www.codeplex.com/wpf/)
А что мне дает WPF как разработчику? • WPF действительно позволяет отделить представление от логики и данных • «Чистая» реализация паттернов вроде MVC • Покрытие юнит-тестами • Разработка UI параллельно с логикой • Механизмы стилей и шаблонов значительно повышают code reuse • Более 90% всего, что связано с представлением, создается декларативно
ResourceDictionary • WPF позволяет хранить в ресурсах экземпляр любого объекта с ключом любого типа • Словарь ресурсовможет ссылаться на другие словари • Любой контрол, стиль или темплейт имеет свой словарь ресурсов
Styles • Стиль – это набор ресурсов, значений свойств, обработчиков событий и триггеров • Стили могут применяться явно или автоматически в пределах любой области видимости • Стили поддерживают наследование и применение отдельных частей стиля в зависимости от типа контрола • StyleSelector’ы позволяют применять стили в соответствии с заданной логикой
Templates • Темплейты позволяют полностью изменить внешний вид контрола • Логика поведения контрола может использовать именованные части темплейта • Элементы в темплейте могут использовать значения свойств контрола • DataTemplateSelector’ы позволяютвыбирать темплейт в зависимости от данных
Работа с данными • XmlDataProvider – работа с XML • ObjectDataProvider – вызов методов и создание экземпляров класса • CollectionViewSource – фильтрация, сортировка, группировка • CompositeCollection – объединение коллекций
Bindings • В WPF можно привязать значение DependencyProperty к любому набору источников • Свойство не ReadOnly • FrameworkPropertyMetadata.IsNotDataBindable == false • Binding’и могут быть в любом направлении, с конвертацией данных, с явным или автоматическим обновлением, валидацией • Источник может быть задан явно, относительно Binding’а или по имени
Свойство DataContext • DataContextпозволяет привязывать данные к иерархии объектов • DataContextнаследует значение • Значение этого свойства у родителя передается всем дочерним контролам, для которых оно не задано явно • Binding’и других свойств объекта затем могут быть заданы относительно DataContext’а
RoutedEvents& InputBindings • Механизм RoutedEventsпозволяет одним контролам порождатькоманды, а другим перехватывать и выполнять действия • Команды передаются по дереву контролов и могут быть перехвачены несколькими контролами • Обработчики для команд также могут задаваться в стилях • WPF позволяет порождать команды с помощью комбинации клавиш и нажатий кнопок мыши (InputBindings)
Triggers • Триггеры позволяют декларативно описывать измения свойства контролов и управлять анимацией • Триггеры можно: • вешать на срабатывание событий или изменение значений свойств • задавать на уровне контролов, стилей или темплейтов • комбинировать с биндингами для полного контроля над изменениями представления
Практические заметки • Используйте DataContextдля поддерева контролов, связанных с общим источником данных • Выделяйте все повторяющиеся значения свойств контролов в стили • Храните описание темплейтов как можно выше в дереве контролов • Старайтесь подключать словари ресурсов на уровне Application (если допускает Scope) • Активное использование RoutedCommands не сильно, но снижает производительность
Практические заметки • CustomControl + Template предпочтительнее UserControl • Используйте ValueConverter’ы и Selector’ы • DataTrigger + MultiBinding + Converter дает больше контроля, чемMultiDataTrigger • Не ориентируйтесь на взаимное расположение частей контрола • Старайтесь не использовать код в самом представлении, но не делайте из этого табу!
Ссылки • Раздел, посвященный WPF в MSDN:http://msdn.microsoft.com/wpf • WPF на CodePlex: http://www.codeplex.com/wpf • Собрание блоггеров (Dr. WPF, John Smith, Beatriz Costa, etc.):http://wpfdisciples.wordpress.com/