Разработка пользовательских элементов управления в wpf
DESCRIPTION
Открытый семинар для студентов в компании CUSTIS (20 июня 2013). Лектор: Павел Музыка, ведущий разработчик (С#, SQL), сертифицированный разработчик Microsoft (MCTS, MCPD, MCITPro) WPF — это система построения клиентских приложений Windows с визуально привлекательными возможностями взаимодействия с пользователем. С помощью WPF можно создавать широкий спектр как автономных, так и браузерных приложений. Из семинара вы узнаете об особенностях создания и кастомизации пользовательских элементов управления в Windows Presentation Foundation. Видеозапись выступления: https://vimeo.com/69144418.TRANSCRIPT
![Page 1: Разработка пользовательских элементов управления в WPF](https://reader034.vdocuments.site/reader034/viewer/2022050619/557ed824d8b42a815a8b4ada/html5/thumbnails/1.jpg)
Разработка
пользовательских элементов
управления в WPF
Павел Музыка
Ведущий разработчик C#
20 июня 2013 года
![Page 2: Разработка пользовательских элементов управления в WPF](https://reader034.vdocuments.site/reader034/viewer/2022050619/557ed824d8b42a815a8b4ada/html5/thumbnails/2.jpg)
О себе
Окончил Калужский Филиал
МГТУ им. Н. Э. Баумана
В промышленной разработке с 2005 года
В компании CUSTIS c февраля 2012 года
Сертифицированный разработчик
MS SQL, WinForms и WPF
2/81
![Page 3: Разработка пользовательских элементов управления в WPF](https://reader034.vdocuments.site/reader034/viewer/2022050619/557ed824d8b42a815a8b4ada/html5/thumbnails/3.jpg)
О вас
Откуда?
Почему пришли на этот семинар?
Что знаете про WPF?
Какой опыт разработки на WPF?
3/81
![Page 4: Разработка пользовательских элементов управления в WPF](https://reader034.vdocuments.site/reader034/viewer/2022050619/557ed824d8b42a815a8b4ada/html5/thumbnails/4.jpg)
План
Кастомизация контролов в WPF
Визуальная структура контролов
Варианты кастомизации
Создание собственного контрола
Мастер-класс по созданию Custom Control
4/81
![Page 5: Разработка пользовательских элементов управления в WPF](https://reader034.vdocuments.site/reader034/viewer/2022050619/557ed824d8b42a815a8b4ada/html5/thumbnails/5.jpg)
Где я?
Кастомизация контролов в WPF
Визуальная структура контролов
Варианты кастомизации
Создание собственного контрола
Мастер-класс по созданию Custom Control
5/81
![Page 6: Разработка пользовательских элементов управления в WPF](https://reader034.vdocuments.site/reader034/viewer/2022050619/557ed824d8b42a815a8b4ada/html5/thumbnails/6.jpg)
Визуальное vs Логическое дерево
Логический родитель для Button – это Grid
Визуальный родитель для Button – это Grid
6/81
![Page 7: Разработка пользовательских элементов управления в WPF](https://reader034.vdocuments.site/reader034/viewer/2022050619/557ed824d8b42a815a8b4ada/html5/thumbnails/7.jpg)
Визуальное vs Логическое дерево
Логический родитель для TextBlock – это Button
Визуальный родитель для TextBlock – это НЕ Button
7/81
![Page 8: Разработка пользовательских элементов управления в WPF](https://reader034.vdocuments.site/reader034/viewer/2022050619/557ed824d8b42a815a8b4ada/html5/thumbnails/8.jpg)
Визуальное дерево != Логическое дерево
8/81
![Page 9: Разработка пользовательских элементов управления в WPF](https://reader034.vdocuments.site/reader034/viewer/2022050619/557ed824d8b42a815a8b4ada/html5/thumbnails/9.jpg)
Логическое дерево
Описывает отношения между элементами
на пользовательском интерфейсе
Используется для:
наследования значений DependencyProperty
разрешения ссылок DynamicResources
поиска названий элементов для биндинга
маршрутизации событий
FrameworkElement.Parent – возвращает
логического родителя
9/81
![Page 10: Разработка пользовательских элементов управления в WPF](https://reader034.vdocuments.site/reader034/viewer/2022050619/557ed824d8b42a815a8b4ada/html5/thumbnails/10.jpg)
Визуальное дерево
Состоит из объектов, потомков Visual
и Visual3D
Используется для:
рендеринга
наследования прозрачности
наследования визуальных преобразований
наследования свойства IsEnabled
RelativeSource (FindAncestor)
VisualTreeHelper.GetParent (reference) –
возвращает визуального родителя
10/81
![Page 11: Разработка пользовательских элементов управления в WPF](https://reader034.vdocuments.site/reader034/viewer/2022050619/557ed824d8b42a815a8b4ada/html5/thumbnails/11.jpg)
Шаблоны (Template)
У Button есть собственный шаблон
со своей структурой, определяющий,
как рисовать кнопку
Шаблон задает структуру визуального
дерева внутри элемента
Шаблон НЕ задает структуру логического
дерева
11/81
![Page 12: Разработка пользовательских элементов управления в WPF](https://reader034.vdocuments.site/reader034/viewer/2022050619/557ed824d8b42a815a8b4ada/html5/thumbnails/12.jpg)
Визуальное дерево
12/81
![Page 13: Разработка пользовательских элементов управления в WPF](https://reader034.vdocuments.site/reader034/viewer/2022050619/557ed824d8b42a815a8b4ada/html5/thumbnails/13.jpg)
Логическое
дерево
Визуальное
дерево
13/81
![Page 14: Разработка пользовательских элементов управления в WPF](https://reader034.vdocuments.site/reader034/viewer/2022050619/557ed824d8b42a815a8b4ada/html5/thumbnails/14.jpg)
Наследование свойств
14/81
![Page 15: Разработка пользовательских элементов управления в WPF](https://reader034.vdocuments.site/reader034/viewer/2022050619/557ed824d8b42a815a8b4ada/html5/thumbnails/15.jpg)
Где я?
Кастомизация контролов в WPF
Визуальная и логическая структуры
Варианты кастомизации
Создание собственного контрола
Мастер-класс по созданию Custom Control
15/81
![Page 16: Разработка пользовательских элементов управления в WPF](https://reader034.vdocuments.site/reader034/viewer/2022050619/557ed824d8b42a815a8b4ada/html5/thumbnails/16.jpg)
Варианты кастомизации
Богатое содержимое (Rich content)
Стили (Styles)
Шаблоны данных (DataTemplate)
Шаблоны контролов (ControlTemplate)
Триггеры (Triggers)
Присоединенные свойства (Attached properties)
16/81
![Page 17: Разработка пользовательских элементов управления в WPF](https://reader034.vdocuments.site/reader034/viewer/2022050619/557ed824d8b42a815a8b4ada/html5/thumbnails/17.jpg)
Задача
Кнопка подтверждения должна
содержать внутри себя флаг
проверки перед выполнением
действия.
?
17/81
![Page 18: Разработка пользовательских элементов управления в WPF](https://reader034.vdocuments.site/reader034/viewer/2022050619/557ed824d8b42a815a8b4ada/html5/thumbnails/18.jpg)
Богатое содержимое
Применимо для потомков Content Control
Content – любой объект
Не меняет исходное поведение контрола
Используется по месту в случае
необходимости точечно изменить
представление
18/81
![Page 19: Разработка пользовательских элементов управления в WPF](https://reader034.vdocuments.site/reader034/viewer/2022050619/557ed824d8b42a815a8b4ada/html5/thumbnails/19.jpg)
Богатое содержимое
19/81
![Page 20: Разработка пользовательских элементов управления в WPF](https://reader034.vdocuments.site/reader034/viewer/2022050619/557ed824d8b42a815a8b4ada/html5/thumbnails/20.jpg)
Свойство по умолчанию
20/81
![Page 21: Разработка пользовательских элементов управления в WPF](https://reader034.vdocuments.site/reader034/viewer/2022050619/557ed824d8b42a815a8b4ada/html5/thumbnails/21.jpg)
Свойство по умолчанию
21/81
![Page 22: Разработка пользовательских элементов управления в WPF](https://reader034.vdocuments.site/reader034/viewer/2022050619/557ed824d8b42a815a8b4ada/html5/thumbnails/22.jpg)
Варианты кастомизации
Богатое содержимое (Rich content)
Стили (Styles)
Шаблоны данных (DataTemplate)
Шаблоны контролов (ControlTemplate)
Триггеры (Triggers)
Присоединенные свойства (Attached properties)
22/81
![Page 23: Разработка пользовательских элементов управления в WPF](https://reader034.vdocuments.site/reader034/viewer/2022050619/557ed824d8b42a815a8b4ada/html5/thumbnails/23.jpg)
Задача
На всех кнопках шрифт должен
быть «SketchFlow Print»
Размер шрифта «30»
Цвет текста «Красный»
Цвет границы «Красный»
?
23/81
![Page 24: Разработка пользовательских элементов управления в WPF](https://reader034.vdocuments.site/reader034/viewer/2022050619/557ed824d8b42a815a8b4ada/html5/thumbnails/24.jpg)
Стили (Styles)
Стиль – это набор значений свойств,
который можно применить к одному
или нескольким элементам управления
Позволяет в одном месте задавать
свойства для однотипных элементов
Не меняет визуальную структуру элемента
управления
Не меняет поведение элемента
управления
24/81
![Page 25: Разработка пользовательских элементов управления в WPF](https://reader034.vdocuments.site/reader034/viewer/2022050619/557ed824d8b42a815a8b4ada/html5/thumbnails/25.jpg)
Стили (Styles)
25/81
![Page 26: Разработка пользовательских элементов управления в WPF](https://reader034.vdocuments.site/reader034/viewer/2022050619/557ed824d8b42a815a8b4ada/html5/thumbnails/26.jpg)
Варианты кастомизации
Богатое содержимое (Rich content)
Стили (Styles)
Шаблоны данных (DataTemplate)
Шаблоны контролов (ControlTemplate)
Триггеры (Triggers)
Присоединенные свойства (Attached properties)
26/81
![Page 27: Разработка пользовательских элементов управления в WPF](https://reader034.vdocuments.site/reader034/viewer/2022050619/557ed824d8b42a815a8b4ada/html5/thumbnails/27.jpg)
Задача
Сделать список для выбора
нескольких состояний
для настройки фильтра заказов.
27/81
?
![Page 28: Разработка пользовательских элементов управления в WPF](https://reader034.vdocuments.site/reader034/viewer/2022050619/557ed824d8b42a815a8b4ada/html5/thumbnails/28.jpg)
Шаблоны данных (DataTemplate)
Задает визуальную структуру
для представления объекта данных
Чаще всего используется для стилизации
списков
Может применяться совместно
с DataTemplateSelector, что позволяет
менять представление в зависимости
от типа и/или значений данных
28/81
![Page 29: Разработка пользовательских элементов управления в WPF](https://reader034.vdocuments.site/reader034/viewer/2022050619/557ed824d8b42a815a8b4ada/html5/thumbnails/29.jpg)
Шаблоны данных (DataTemplate)
29/81
![Page 30: Разработка пользовательских элементов управления в WPF](https://reader034.vdocuments.site/reader034/viewer/2022050619/557ed824d8b42a815a8b4ada/html5/thumbnails/30.jpg)
Новые требования
Рядом со статусом «Отправлен»
должно быть поле для ввода
даты отправки.
Рядом со статусом «В пути»
должен быть комбобокс
для выбора получателя.
30/81
?
![Page 31: Разработка пользовательских элементов управления в WPF](https://reader034.vdocuments.site/reader034/viewer/2022050619/557ed824d8b42a815a8b4ada/html5/thumbnails/31.jpg)
Новые требования!
31/81
![Page 32: Разработка пользовательских элементов управления в WPF](https://reader034.vdocuments.site/reader034/viewer/2022050619/557ed824d8b42a815a8b4ada/html5/thumbnails/32.jpg)
DataTemplateSelector
Класс-потомок от DataTemplateSelector
Позволяет в зависимости от данных
использовать различные шаблоны
Существуют также StyleSelector’ы
Примеры кода объемные, можно
посмотреть после семинара
32/81
![Page 33: Разработка пользовательских элементов управления в WPF](https://reader034.vdocuments.site/reader034/viewer/2022050619/557ed824d8b42a815a8b4ada/html5/thumbnails/33.jpg)
33/81
![Page 34: Разработка пользовательских элементов управления в WPF](https://reader034.vdocuments.site/reader034/viewer/2022050619/557ed824d8b42a815a8b4ada/html5/thumbnails/34.jpg)
Варианты кастомизации
Богатое содержимое (Rich content)
Стили (Styles)
Шаблоны данных (DataTemplate)
Шаблоны контролов (ControlTemplate)
Триггеры (Triggers)
Присоединенные свойства (Attached properties)
34/81
![Page 35: Разработка пользовательских элементов управления в WPF](https://reader034.vdocuments.site/reader034/viewer/2022050619/557ed824d8b42a815a8b4ada/html5/thumbnails/35.jpg)
Задача
Сделать овальные кнопки с текстом.
35/81
?
![Page 36: Разработка пользовательских элементов управления в WPF](https://reader034.vdocuments.site/reader034/viewer/2022050619/557ed824d8b42a815a8b4ada/html5/thumbnails/36.jpg)
Шаблоны контролов
Позволяют менять визуальную структуру
элемента управления, не создавая своего
контрола
Используются, когда надо изменить
внешний вид и внешнее поведение
контрола, но не надо менять его
внутреннюю логику работы
36/81
![Page 37: Разработка пользовательских элементов управления в WPF](https://reader034.vdocuments.site/reader034/viewer/2022050619/557ed824d8b42a815a8b4ada/html5/thumbnails/37.jpg)
Шаблоны контролов
37/81
![Page 38: Разработка пользовательских элементов управления в WPF](https://reader034.vdocuments.site/reader034/viewer/2022050619/557ed824d8b42a815a8b4ada/html5/thumbnails/38.jpg)
Варианты кастомизации
Богатое содержимое (Rich content)
Стили (Styles)
Шаблоны данных (DataTemplate)
Шаблоны контролов (ControlTemplate)
Триггеры (Triggers)
Присоединенные свойства (Attached properties)
38/81
![Page 39: Разработка пользовательских элементов управления в WPF](https://reader034.vdocuments.site/reader034/viewer/2022050619/557ed824d8b42a815a8b4ada/html5/thumbnails/39.jpg)
Задача
Сделать овальные кнопки с текстом
«активными», так чтобы при
наведении мыши менялся фон.
?
39/81
?
![Page 40: Разработка пользовательских элементов управления в WPF](https://reader034.vdocuments.site/reader034/viewer/2022050619/557ed824d8b42a815a8b4ada/html5/thumbnails/40.jpg)
Триггеры (Triggers)
Позволяют устанавливать свойства
элементов управления в зависимости
от событий или состояний
Позволяют использовать анимацию
40/81
![Page 41: Разработка пользовательских элементов управления в WPF](https://reader034.vdocuments.site/reader034/viewer/2022050619/557ed824d8b42a815a8b4ada/html5/thumbnails/41.jpg)
Триггеры (Triggers)
41/81
![Page 42: Разработка пользовательских элементов управления в WPF](https://reader034.vdocuments.site/reader034/viewer/2022050619/557ed824d8b42a815a8b4ada/html5/thumbnails/42.jpg)
Варианты кастомизации
Богатое содержимое (Rich content)
Стили (Styles)
Шаблоны данных (DataTemplate)
Шаблоны контролов (ControlTemplate)
Триггеры (Triggers)
Присоединенные свойства (Attached properties)
42/81
![Page 43: Разработка пользовательских элементов управления в WPF](https://reader034.vdocuments.site/reader034/viewer/2022050619/557ed824d8b42a815a8b4ada/html5/thumbnails/43.jpg)
Присоединенные свойства
Это DependencyProperty, которые
объявлены как Attached и не имеют CLR
свойства-обертки
Концепция, созданная для XAML
Могут быть присвоены любому объекту
Вместо CLR свойства-обертки имеются
два метода Get<Свойство>(object)
и Set<Свойство>(object, value)
43/81
![Page 44: Разработка пользовательских элементов управления в WPF](https://reader034.vdocuments.site/reader034/viewer/2022050619/557ed824d8b42a815a8b4ada/html5/thumbnails/44.jpg)
Вариант применения – 1
Тип, в котором объявлено свойство,
спроектирован как родитель (контейнер)
для элементов, в которых это свойство
установлено
44/81
![Page 45: Разработка пользовательских элементов управления в WPF](https://reader034.vdocuments.site/reader034/viewer/2022050619/557ed824d8b42a815a8b4ada/html5/thumbnails/45.jpg)
Вариант применения – 2
Тип, в котором объявлено свойство,
спроектирован как дочерний для различных
родителей (контейнеров) или моделей
содержимого
45/81
![Page 46: Разработка пользовательских элементов управления в WPF](https://reader034.vdocuments.site/reader034/viewer/2022050619/557ed824d8b42a815a8b4ada/html5/thumbnails/46.jpg)
Вариант применения – 3
Тип, в котором объявлено свойство,
является сервисом. Объекты,
устанавливающие это свойство, будут
рассматриваться в контексте сервиса
46/81
![Page 47: Разработка пользовательских элементов управления в WPF](https://reader034.vdocuments.site/reader034/viewer/2022050619/557ed824d8b42a815a8b4ada/html5/thumbnails/47.jpg)
Варианты кастомизации
Богатое содержимое (Rich content)
Стили (Styles)
Шаблоны данных (DataTemplate)
Шаблоны контролов (ControlTemplate)
Триггеры (Triggers)
Присоединенные свойства (Attached properties)
47/81
![Page 48: Разработка пользовательских элементов управления в WPF](https://reader034.vdocuments.site/reader034/viewer/2022050619/557ed824d8b42a815a8b4ada/html5/thumbnails/48.jpg)
![Page 49: Разработка пользовательских элементов управления в WPF](https://reader034.vdocuments.site/reader034/viewer/2022050619/557ed824d8b42a815a8b4ada/html5/thumbnails/49.jpg)
Где я?
Кастомизация контролов в WPF
Визуальная и логическая структуры
Варианты кастомизации
Создание собственного контрола
Мастер-класс по созданию Custom Control
49/81
![Page 50: Разработка пользовательских элементов управления в WPF](https://reader034.vdocuments.site/reader034/viewer/2022050619/557ed824d8b42a815a8b4ada/html5/thumbnails/50.jpg)
Создание собственного контрола
Должно быть обосновано именно
создание нового класса
Должен быть обоснован выбор
базового класса
Должен полноценно работать
в визуальном редакторе Visual Studio
50/81
![Page 51: Разработка пользовательских элементов управления в WPF](https://reader034.vdocuments.site/reader034/viewer/2022050619/557ed824d8b42a815a8b4ada/html5/thumbnails/51.jpg)
Создание собственного контрола
Должно быть обосновано именно
создание нового класса
Должен быть обоснован выбор
базового класса
Должен полноценно работать
в визуальном редакторе Visual Studio
51/81
![Page 52: Разработка пользовательских элементов управления в WPF](https://reader034.vdocuments.site/reader034/viewer/2022050619/557ed824d8b42a815a8b4ada/html5/thumbnails/52.jpg)
Обоснование нового класса
Объединить поведение нескольких
элементов в одном и повторно
использовать на разных формах
Расширить или изменить поведение
существующего контрола
Если это невозможно или слишком дорого
сделать на триггерах
Расширить или изменить как визуальную
структуру, так и поведение контрола
Если для этого не подходит ControlTemplate
52/81
![Page 53: Разработка пользовательских элементов управления в WPF](https://reader034.vdocuments.site/reader034/viewer/2022050619/557ed824d8b42a815a8b4ada/html5/thumbnails/53.jpg)
Создание собственного контрола
Должно быть обосновано именно
создание нового класса
Должен быть обоснован выбор
базового класса
Должен полноценно работать
в визуальном редакторе Visual Studio
53/81
![Page 54: Разработка пользовательских элементов управления в WPF](https://reader034.vdocuments.site/reader034/viewer/2022050619/557ed824d8b42a815a8b4ada/html5/thumbnails/54.jpg)
Выбор базового класса
при создании собственного
контрола
54/81
![Page 55: Разработка пользовательских элементов управления в WPF](https://reader034.vdocuments.site/reader034/viewer/2022050619/557ed824d8b42a815a8b4ada/html5/thumbnails/55.jpg)
55/81
![Page 56: Разработка пользовательских элементов управления в WPF](https://reader034.vdocuments.site/reader034/viewer/2022050619/557ed824d8b42a815a8b4ada/html5/thumbnails/56.jpg)
Вариант 1
56/81
![Page 57: Разработка пользовательских элементов управления в WPF](https://reader034.vdocuments.site/reader034/viewer/2022050619/557ed824d8b42a815a8b4ada/html5/thumbnails/57.jpg)
UserControl
57/81
![Page 58: Разработка пользовательских элементов управления в WPF](https://reader034.vdocuments.site/reader034/viewer/2022050619/557ed824d8b42a815a8b4ada/html5/thumbnails/58.jpg)
UserControl. Плюшки
Поддержка редактирования в визуальном
редакторе
Легкая компоновка существующих
контролов
Легко прикручивается дополнительная
логика за счет наличия code-behind
файлов
58/81
![Page 59: Разработка пользовательских элементов управления в WPF](https://reader034.vdocuments.site/reader034/viewer/2022050619/557ed824d8b42a815a8b4ada/html5/thumbnails/59.jpg)
UserControl. Недостатки
Ограничены возможности кастомизации:
нельзя менять визуальную структуру
при использовании
Непригодность для «библиотечного»
использования
59/81
![Page 60: Разработка пользовательских элементов управления в WPF](https://reader034.vdocuments.site/reader034/viewer/2022050619/557ed824d8b42a815a8b4ada/html5/thumbnails/60.jpg)
Вариант 2
60/81
![Page 61: Разработка пользовательских элементов управления в WPF](https://reader034.vdocuments.site/reader034/viewer/2022050619/557ed824d8b42a815a8b4ada/html5/thumbnails/61.jpg)
Custom Control
61/81
![Page 62: Разработка пользовательских элементов управления в WPF](https://reader034.vdocuments.site/reader034/viewer/2022050619/557ed824d8b42a815a8b4ada/html5/thumbnails/62.jpg)
Custom Control
62/81
![Page 63: Разработка пользовательских элементов управления в WPF](https://reader034.vdocuments.site/reader034/viewer/2022050619/557ed824d8b42a815a8b4ada/html5/thumbnails/63.jpg)
Custom Control. Плюшки
Явное отделение представления от логики
Возможность изменения визуального
дерева при использовании
(применение собственных ControlTemplate)
Возможность подключать темы
для изменения цветового и стилевого
оформления
Пригодность для «библиотечного»
использования
63/81
![Page 64: Разработка пользовательских элементов управления в WPF](https://reader034.vdocuments.site/reader034/viewer/2022050619/557ed824d8b42a815a8b4ada/html5/thumbnails/64.jpg)
Custom Control. Недостатки
Невозможно редактировать в визуальном
редакторе (хотя можно использовать
Expression Blend для этого)
Сложнее и дороже, чем UserControl
Требует более глубокого понимания
механизмов работы всей технологии WPF
Сложная отладка работы в визуальном
редакторе
64/81
![Page 65: Разработка пользовательских элементов управления в WPF](https://reader034.vdocuments.site/reader034/viewer/2022050619/557ed824d8b42a815a8b4ada/html5/thumbnails/65.jpg)
Создание собственного контрола
Должно быть обосновано именно
создание нового класса
Должен быть обоснован выбор
базового класса
Должен полноценно работать
в визуальном редакторе Visual Studio
65/81
![Page 66: Разработка пользовательских элементов управления в WPF](https://reader034.vdocuments.site/reader034/viewer/2022050619/557ed824d8b42a815a8b4ada/html5/thumbnails/66.jpg)
Поддержка работы
в визуальном редакторе
Visual Studio
66/81
![Page 67: Разработка пользовательских элементов управления в WPF](https://reader034.vdocuments.site/reader034/viewer/2022050619/557ed824d8b42a815a8b4ada/html5/thumbnails/67.jpg)
Особенности работы
в визуальном редакторе Visual Studio
Значения свойств, отвечающих
за визуальную составляющую, должны
вызывать перерисовку контрола
моментально, а не только в момент вызова
конструктора
Создавайте DependencyProperty в своих
контролах и отслеживайте их изменения
Изменения любых свойств не должны
«ронять» весь визуальный редактор
67/81
![Page 68: Разработка пользовательских элементов управления в WPF](https://reader034.vdocuments.site/reader034/viewer/2022050619/557ed824d8b42a815a8b4ada/html5/thumbnails/68.jpg)
Выявление ошибок работы
в визуальном редакторе
Сложная отладка:
Надо внедряться в служебный процесс
визуального редактора (XDesProc.exe)
Надо перехватывать все исключения,
в том числе исключения биндинга
Понимание всего процесса применения
шаблонов и стилей, последовательность
возникновения событий
68/81
![Page 69: Разработка пользовательских элементов управления в WPF](https://reader034.vdocuments.site/reader034/viewer/2022050619/557ed824d8b42a815a8b4ada/html5/thumbnails/69.jpg)
Удобство пользователя
Пользователем Custom Control является
не бухгалтер, а другой разработчик!
Сделайте Custom Control так, как если бы
вам пришлось его использовать
Проверьте сами на другом проекте
Проверьте еще раз на еще одном проекте!
Придумайте реальный сценарий, который
«уронит» ваш контрол
Явно и доступно описывайте ограничения
применимости вашего контрола 69/81
![Page 70: Разработка пользовательских элементов управления в WPF](https://reader034.vdocuments.site/reader034/viewer/2022050619/557ed824d8b42a815a8b4ada/html5/thumbnails/70.jpg)
70/81
Отдохнем?
![Page 71: Разработка пользовательских элементов управления в WPF](https://reader034.vdocuments.site/reader034/viewer/2022050619/557ed824d8b42a815a8b4ada/html5/thumbnails/71.jpg)
Где я?
Кастомизация контролов в WPF
Варианты кастомизации
Создание собственного контрола
Мастер-класс по созданию Custom Control
71/81
![Page 72: Разработка пользовательских элементов управления в WPF](https://reader034.vdocuments.site/reader034/viewer/2022050619/557ed824d8b42a815a8b4ada/html5/thumbnails/72.jpg)
Задача
72/81
Все текстовые поля должны
иметь кнопку для сброса
значения.
При нажатии на кнопку текст
должен сбрасываться.
?
![Page 73: Разработка пользовательских элементов управления в WPF](https://reader034.vdocuments.site/reader034/viewer/2022050619/557ed824d8b42a815a8b4ada/html5/thumbnails/73.jpg)
Демонстрация в Visual Studio
73/81
![Page 74: Разработка пользовательских элементов управления в WPF](https://reader034.vdocuments.site/reader034/viewer/2022050619/557ed824d8b42a815a8b4ada/html5/thumbnails/74.jpg)
Новые требования!
74/81
Кнопка сброса значения
должна быть видна не постоянно,
а только если указатель мыши
находится над контролом.
?
![Page 75: Разработка пользовательских элементов управления в WPF](https://reader034.vdocuments.site/reader034/viewer/2022050619/557ed824d8b42a815a8b4ada/html5/thumbnails/75.jpg)
Демонстрация в Visual Studio
75/81
![Page 76: Разработка пользовательских элементов управления в WPF](https://reader034.vdocuments.site/reader034/viewer/2022050619/557ed824d8b42a815a8b4ada/html5/thumbnails/76.jpg)
Новые требования!
76/81
• Необходимо иметь возможность
подписаться на событие сброса
текста. В параметрах события надо
иметь информацию о старом
значении.
?
![Page 77: Разработка пользовательских элементов управления в WPF](https://reader034.vdocuments.site/reader034/viewer/2022050619/557ed824d8b42a815a8b4ada/html5/thumbnails/77.jpg)
Демонстрация в Visual Studio
77/81
![Page 78: Разработка пользовательских элементов управления в WPF](https://reader034.vdocuments.site/reader034/viewer/2022050619/557ed824d8b42a815a8b4ada/html5/thumbnails/78.jpg)
Основные шаги
Создать проект WPF Custom Control Library
Добавить новый Custom Control (WPF)
Унаследовать контрол от TextBox
и скопировать исходное визуальное дерево
Изменить визуальное дерево, не ломая
логики родительского контрола
Добавить свою логику инициализации после
применения шаблона (переопределить
метод OnApplyTemplate)
78/81
![Page 79: Разработка пользовательских элементов управления в WPF](https://reader034.vdocuments.site/reader034/viewer/2022050619/557ed824d8b42a815a8b4ada/html5/thumbnails/79.jpg)
Темы для дальнейшего изучения
Расширения разметки
Привязки данных (Data binding)
DependencyObject и DependencyProperty
Маршрутизируемые события
(RoutedEvents)
Поведения (behaviors)
79/81
![Page 80: Разработка пользовательских элементов управления в WPF](https://reader034.vdocuments.site/reader034/viewer/2022050619/557ed824d8b42a815a8b4ada/html5/thumbnails/80.jpg)
Что почитать еще?
http://msdn.microsoft.com/
https://www.google.com/
http://wpfinspector.codeplex.com/
Учебник/курсы английского языка
80/81