Михаил Черномордиков Developer Evangelist, Microsoft Россия
Модель элементов управления
Использование UserControl
UserControl Сценарии Фиксированный внешний вид с одной и той же логикой Разделение больших страниц на мелкие части Повторное использование разметки и логики Поддержка платформы … public partial class MyControl : UserControl {} XAML необязателен
UserControl «Страница» в Silverlight является UserControl Визуальные элементы Связывание данных События клавиатуры и мыши … и многое другое
User Controls Custom Controls 1.Декомпозиция приложения 2.Повторное использование 1. Разделение на модули 2. Дизайнер может менять внешний вид
Custom Controls Сценарии Четкое разделение между логикой и представлением Возможность изменять визуальное представление без влияния на программную логику Поддержка платформы Включен большой набор custom controls Созданы возможности для создания новых custom controls
Styling
Styling Ресурсы Общий XAML-файл, на который могут ссылаться различные элементы вашего приложения Набор свойств, который могут быть применимы к элементам управления, тексту, формам и т.д. Silverlight 2 Write once поведение Темы приложений пока не поддерживаются BasedOn-стили пока не поддерживаются
Skinning
Skinning Набор элементов, создающих визуальную структуру элемента управления {TemplateBinding} Связывание между визуальным шаблоном и визуальными свойствами элемента управления
Styling и Skinning Простая форма
Внешний вид по умолчанию generic.xaml Ресурс проекта в DLL-файле элемента управления Содержит ресурсный словарь с встроенными стилями DefaultStyleKey Значение – тип элемента управления Указывает на generic.xaml и конкретный стиль в нем Можно указать субкласс для изменения внешнего вида по умолчанию Стиль по умолчанию НЕ влияет на свойство Style элемента управления
Определение контракта Мне нужен бегунок, нажатое состояние… Пытаюсь понять, что мне нужно поместить в шаблон… Сделаем тебе бегунок, нажатое состояние…
Введение в модель частей и состояний Цели Определение структуры элемента управления Явное разделение логики и представления Явный контракт элемента управления Рекомендации НЕ делать определения в runtime Есть поддержка в Blend
Части Именованные элементы шаблона Код взаимодействует с этими элементами каким-либо образом
Состояния Визуальное представление элемента в конкретном состоянии MouseOver Pressed
Переходы Визуальное представление элемента во время перехода между состояниями MouseOverPressed
Группы состояний Группа непересекающихся состояний Различные группы ортогональны друг другу Поддержка в Expression Blend
Пример состояний - CheckBox CommonStates Normal Mouseover Pressed Disabled CheckStates Unchecked Checked Indeterminate
VisualStateManager VisualStateManager VisualStateGroups
Использование состояний VisualState class Содержит storyboard с определением представления Может быть статичной или постепенной анимацией VisualStateGroup class Коллекция непересекающихся объектов класса VisualState
Использование переходов VisualTransition class Как выглядит элемент управления во время перехода между состояниями Содержит длительность автоматической анимации переходов
Типы VisualTransition Типы переходов: (MouseOver -> Pressed) From/To To From Default Выбирается наиболее специфичный тип
VisualStateManager VisualStateManager GoToState() VisualStateGroups
Создание логики элемента управления Метаданные контракта элемента управления [TemplatePart] для определения конкретной части [TemplateVisualState] для определения конкретного состояния НЕ используется в runtime. Используется инструментами – Visual Studio, Expression Studio
VisualStateManager.GoToState(control, stateName, useTransitions) Управляет логикой изменения состояний Возвращает true, если состояние было найдено Выбирает наиболее подходящий переход VisualTransition Генерирует автоматические переходы Создание логики элемента управления
Visual State Manager Изменение вида стандартного элемента
public override void OnApplyTemplate() Вызывается, когда новый шаблон был применен Должен найти все Части Должен инициализировать изменения состояний без переходов FrameworkElement GetTemplateChild() Возвращает именованный элемент внутри шаблона Создание логики элемента управления
Что получаем в итоге? UserControls Custom Controls Styles & Templates ContentControls VisualStateManager
Михаил Черномордиков Developer Evangelist, Microsoft Россия