06_Березина_Style_Templates

advertisement
Классы Windows Presentation Foundation
System.Object
DispatcherObject
Application
DependencyObject
NavigationService
FrameworkTemplate
Visual
ContentElement
UIElement
FrameworkContentElement
Style
FrameworkElement
Page
Shape
TextBlock
ContentControl
RangeBase
TextBoxBase
Frame
Slider
TextBox
Window
ProgressBar
RichTextBox
Grid
ItemsControl
Menu
ContextMenu
HeaderedItemsControl
MenuItem
Button
Toolbar
TreeViewItem
Selector
RepeatButton
TabControl
ToggleButton
CheckBox
Canvas
MenuBase
NavigationWindow
ButtonBase
Panel
ToolBarTray
Control
RadioButton
ListBox
ListView
TreeView
ComboBox
Стиль (Style)
 Стили – механизм применения некоторого набора свойств к одному или нескольким
элементам управления.
 Стиль описывается с помощью объекта класса Style, который поддерживает коллекцию
объектов Setter, каждый из которых определяет пару свойство (Property) – значение(Value).
 Можно установить стиль для любого объекта, производного от класса FrameworkElement
или FrameworkContentElement, присвоив значение свойству Style этих классов.
public Style Style { get; set; }
 Стиль можно определить в разметке и в коде. Обычно стиль определяется как ресурс в
разметке.
 Если несколько объектов Setter определено для одного свойства, используется
значение, указанное последним. Значение свойства, присвоенное явно, переопределяет
значение из стиля.
 Стили WPF поддерживают триггеры – объекты, инициирующие изменение значений при
выполнении некоторых условий, например, когда свойство получает значение true или
происходит некоторое событие.
Классы Setter и EventSetter
Object
SetterBase
Setter
EventSetter
 SetterBase - абстрактный базовый класс с единственным
свойством public bool IsSealed { get; }, которое имеет значение
true, если объект находится в неизменяемом состоянии.
 Класс Setter определяет пару свойство-значение (Property/Value).
 Пару свойство-значение можно задать в конструкторах класса
Setter или с помощью свойств, определенных в классе Setter.
public Setter();
public Setter( DependencyProperty property, Object value );
public Setter( DependencyProperty property, Object value,
string targetName );
public Object Value { get; set; }
public DependencyProperty Property { get; set; }
public string TargetName { get; set; }
 Класс EventSetter имеет конструкторы и свойства, с помощью которых в стиле можно
определить пару событие-обработчик.
public
public
public
public
public
EventSetter();
EventSetter( RoutedEvent routedEvent, Delegate handler );
RoutedEvent Event { get; set; }
Delegate Handler { get; set; }
bool HandledEventsToo { get; set; }
Класс Style
 В классе Style определены конструкторы, параметры которых определяют целевой тип
(тип, к которому применяется стиль) и базовый стиль (стиль, на основе которого создается
новый стиль).
public Style();
public Style( Type targetType );
public Style( Type targetType, Style basedOn );
 Класс поддерживает две коллекции – коллекцию объектов Setter / EventSetter и
коллекцию объектов Trigger.
public SetterBaseCollection Setters { get; }
public TriggerCollection Triggers { get; }
 Базовый стиль и целевой тип можно определить как в конструкторах, так и с помощью
свойств.
public Style BasedOn { get; set; }
public Type TargetType { get; set; }
 Если новый стиль определяется на основе базового стиля, то целевой тип TargetType
для нового стиля должен либо совпадать с целевым типом для базового стиля, либо быть
производным от него.
Стиль. Пример
 В примере в разметке определен стиль как ресурс с ключом Style_1.
<Window.Resources>
<LinearGradientBrush x:Key="G_Brush" StartPoint="0,0" EndPoint="1,0">
<GradientStop Color="LightBlue" Offset="0.0" />
<GradientStop Color="SlateBlue" Offset="1.0" />
</LinearGradientBrush>
<Style x:Key="Style_1">
<Setter Property="Control.FontFamily" Value="Times New Roman" />
<Setter Property="Control.FontStyle" Value="Italic" />
<Setter Property="Control.Background" Value="AliceBlue"/>
<Setter Property="Control.Foreground" Value="{StaticResource G_Brush}" />
</Style>
</Window.Resources>
 Этот стиль применен к элементам Button button3 и ListBox listBox1.
<Button Style="{StaticResource Style_1}" Height="25" Margin="10” Name="button3">
Test
</Button>
<ListBox Style="{StaticResource Style_1}" Height="100" Margin="10“ Name="listBox1“>
<ListBoxItem>Item_1</ListBoxItem>
<ListBoxItem>Item_2</ListBoxItem>
</ListBox>
Целевой тип для стиля
 Свойство TargetType класса Style определяет тип, к которому применяется данный
стиль.
<Style TargetType="{x:Type TextBlock}">
<Setter Property="Background" Value="DarkBlue"/>
<Setter Property="Foreground" Value="White" />
</Style>
<Style TargetType="{x:Type TextBlock}" x:Key="Style_Green">
<Setter Property="Background" Value="LightGreen"/>
<Setter Property="Foreground" Value="White" />
</Style>
<Style x:Key="Style_Red">
<Setter Property="Control.Background" Value="Red"/>
<Setter Property="Control.Foreground" Value="White" />
</Style>
 В примере первый стиль определен с указанием целевого типа, но без ключа. Ему
неявно будет присвоен “стандартный” ключ {x:Type TextBlock} и стиль автоматически будет
применен ко всем элементам TextBlock.
 Второй стиль имеет и целевой тип, и ключ ("Style_Green”). Этот стиль будет применен
только к тем элементам TextBlock, где он будет указан явно как значение свойства Style.
 Третий стиль определен без целевого типа, поэтому в элементах Setter для свойств
необходимо указать имя класса (в примере это класс Control). Этот стиль можно
применить к любым элементам, производным от класса Control, при этом необходимо явно
присвоить его как значение свойству Style.
Наследование стиля
 Свойство BasedOn класса Style определяет базовый стиль. Стиль наследует все
значения своего базового стиля, которые явно не переопределяются.
public Style BasedOn { get; set; }
 В примере стиль “Style_On_Red” наследует значения свойств, определенных в стиле
“Style_Red”, и добавляет значение Brushes.Blue для свойства Control.BorderBrush.
<Style x:Key="Style_On_Red" BasedOn="{StaticResource Style_Red}">
<Setter Property="Control.BorderBrush" Value="Blue"/>
</Style>
Триггеры
Object
DispatcherObject
DependencyObject
TriggerBase
DataTrigger
EventTrigger
MultiDataTrigger
MultiTrigger
Trigger
 Триггеры – объекты, инициирующие изменение значений при
выполнении некоторых условий, например, когда свойство
получает значение true или происходит некоторое событие.
 Модель стилей и шаблонов WPF использует триггеры в
классах Style, ControlTemplate и DataTemplate.
 Триггеры дают возможность автоматически изменять
значения свойств элемента в зависимости от действий
пользователя, например, когда пользователь перемещает
курсор в область элемента управления UIElement, его свойство
IsMouseOver получает значение true, и триггер может
переключить значение свойства.
 Свойства, которые изменяются с помощью триггеров,
автоматически восстанавливают свои значения, когда
прекращается выполнение условий переключения.
 MultiTrigger дают возможность переключать значения,
основанные на выполнении нескольких условий.
 EventTrigger позволяют включать изменения, связанные с
событием.
Класс Trigger
 Класс дает возможность автоматически переключать значения свойств зависимостей
при выполнении определенного условия. Свойства класса
public DependencyProperty
Property { get; set; }
Свойство элемента, значение которого сравнивается со значением
свойства Value триггера. Проверяется равенство ссылок.
public Object
Value { get; set; }
Значение триггера, которое используется при сравнении со
значением свойства элемента. Проверяется равенство ссылок.
public SetterBaseCollection
Setters { get; }
Коллекция свойств, значения которых переключаются при
выполнении условия.
public string
SourceName { get; set; }
Имя объекта, свойство которого связано с методом-setter.
Триггеры. Пример
 В примере определен стиль "Style_2” с двумя триггерами, один из которых имеет тип Trigger, другой –
MultiTrigger.
<Style x:Key="Style_2">
<Setter Property="Control.FontStyle" Value="Italic" />
<Setter Property="Control.Background" Value="AliceBlue"/>
<Style.Triggers>
<Trigger Property="Control.IsMouseOver" Value="True">
<Setter Property="Control.Background" Value="LightGreen"/>
<Setter Property="Control.Cursor" Value="Hand"></Setter>
</Trigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="Control.IsFocused" Value="true" />
<Condition Property="Control.IsMouseOver" Value="true" />
</MultiTrigger.Conditions>
<Setter Property="Control.Cursor" Value="ArrowCD"/>
<Setter Property="Control.Background" Value="Green”/>
<Setter Property="Control.Foreground" Value="LightGreen"/>
</MultiTrigger>
</Style.Triggers>
</Style>
 Первый триггер изменяет значения свойств Background и Cursor по условию, которое определяется
значением true свойства IsMouseOver элемента Control (курсор мыши находится в элементе
управления).
 MultiTrigger изменяет значения свойств Foreground, Background и Cursor. Условие переключения
определяется двумя свойствами элемента Control – IsFocused и IsMouseOver. Оба эти свойства
одновременно должны иметь значение true, т.е. элемент управления имеет фокус ввода и курсор мыши
находится в элементе управления.
Шаблоны (Templates)
Object
DispatcherObject
FrameworkTemplate
ControlTemplate
ItemsPanelTemplate
DataTemplate
HierarchicalDataTemplate
 WPF поддерживает три типа шаблонов –
шаблоны элементов управления, шаблоны данных и
шаблоны для ItemsControl.
 Класс DataTemplate дает возможность задать
визуальное представление для объекта с данными.
 Шаблоны данных DataTemplate значительно
упрощают привязку данных к элементам управления,
производных от ItemsControl.
 Шаблон ControlTemplate определяет внешний вид
объекта Control. Каждый объект Control имеет
шаблон ControlTemplate по умолчанию, который
приложение может переопределить.
Шаблон DataTemplate. Пример
 В примере определен шаблон DataTemplate для элементов списка ListBox. Источником
данных для ListBox является коллекция . В типе элементов коллекции есть открытые
свойства FirstName, SecondName и Date.
<ListBox Margin="10" Name="listBox2" Grid.Column="2" >
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Path=FirstName}" />
<TextBlock Text="{Binding Path=SecondName}"/>
<TextBlock Text="{Binding Path=Date}"/>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
Download