Программирование >>  Windows foundation 

1 ... 8 9 10 [ 11 ] 12 13 14 15


DynamicResource требует более высокой производительности, чем StaticResource, поскольку ресурс всегда загружается по необходимости. Применяйте DynamicResource только для тех ресурсов, изменения которых следует ожидать во время выполнения программы.

Триггеры

С помощью триггеров вы можете динамически изменять внешний вид ваших элементов управления, когда происходят некоторые события или изменяются значения некоторых свойств. Например, когда пользователь перемещает указатель мыши над кнопкой, внешний вид кнопки может изменяться. Обычно вы должны делать это в коде C#; но, имея дело с WPF, вы также можете воспользоваться XAML, когда затрагивается только пользовательский интерфейс.

Класс Style имеет свойство Triggers, которому можно назначить триггеры свойств. Следующий пример включает два элемента TextBox внутри панели Canvas. В ресурсах Window определен стиль TextBoxStyle, на который ссылаются элементы TextBox с использованием свойства Style. Стиль TextBoxStyle специфицирует, что Background устанавливается в LightBlue, а FontSize - в 17. Это - стиль элементов TextBox на момент запуска приложения. Использование триггеров изменяет стиль элементов управления. Триггеры определены внутри элементов Style.Triggers посредством элемента Trigger. Один триггер назначается свойству IsMouseOver, другой - свойству IsKeyboardFocused. Оба эти свойства определены с классом TextBox, к которому применяется стиль. Если IsMouseOver получает значение true, возбуждается триггер и устанавливает красный цвет фона, а размер шрифта - 22. Если TextBox имеет клавиатурный фокус, то свойство IsKeyboardFocused равно true, и тогда возбуждается второй триггер и устанавливает свойство Background элемента TextBox в Yellow (желтый фон).

<Window x:Class= TriggerSample.Window1

xmlns= http: schemas.microsoft.com/winfx/2006/xaml/presentation xmlns:x= http: schemas.microsoft.com/winfx/2006/xaml Title= TriggerSample Height= 200 Width= 400

>

<Window.Resources>

<Style x:Key= TextBoxStyle TargetType= {x:Type TextBox} >

<Setter Property= Background Value= LightBlue />

<Setter Property= FontSize Value= 17 /> <Style.Triggers>

<Trigger Property= IsMouseOver Value= True > <Setter Property= Background Value= Red />

<Setter Property= FontSize Value= 22 /> </Trigger>

<Trigger Property= IsKeyboardFocused Value= True > <Setter Property= Background Value= Yellow /> <Setter Property= FontSize Value= 22 /> </Trigger> </Style.Triggers> </Style> </Window.Resources> <Canvas>

<TextBox Canvas.Top= 80 Canvas.Left= 30 Width= 300

Style= {StaticResource TextBoxStyle} /> <TextBox Canvas.Top= 120 Canvas.Left= 30 Width= 300

Style= {StaticResource TextBoxStyle} /> </Canvas> </Window>



Вы не должны сбрасывать значения свойств в первоначальные, когда условие триггера перестает быть актуальным; например, вам не нужно определять триггер для IsMouseOver=true и IsMouseOver=false. Как только условие триггера становится не актуальным, изменения, внесенные действием триггера, сбрасываются в исходные значения автоматически.

На рис. 34.21 показан пример приложения с триггером, где первое текстовое поле имеет фокус клавиатурного ввода, а второй - и размера шрифта.


Рис. 34.21. Пример приложения с триггером значения стиля по умолчанию для фона

При использовании триггеров свойств очень легко изменять внешний вид элементов управления, шрифты, цвета, прозрачность и тому подобное; когда мышь проходит над ними, устанавливается клавиатурный фокус и ни строчки программного кода для этого не требуется.

В классе Trigger определены свойства для спецификации действия триггера, которые перечислены в табл. 34.9.

Таблица 34.9. Свойства класса Trigger

Свойство

Описание

PropertyValue

Setters

EnterActions ExitActions

С триггерами свойств свойства Property и Value используются для спецификации того, когда должен срабатывать триггер. Например,

Property= IsMouseOver , Value= True .

Как только триггер сработал, вы можете применять Setters для определения коллекции элементов Setter для изменения значений свойств. В классе Setter определены свойства Property, TargetName и Value для изменения свойств объекта.

Вместо определения Setters вы можете определить EnterActions и ExitActions. С обоими этими свойствами можно определить коллекцию элементов TriggerAction. Действие EnterActions возбуждается при запуске триггера (для триггеров свойств - когда применяется комбинация Property/ Value), ExitActions возбуждается перед его завершением (точно в момент, когда комбинация Property/Value уже не применяется). Определенные вами действия триггеров порождены от базового класса TriggerAction, такого как SoundPlayerAction и BeginStoryBoard. С помощью SoundPlayerAction вы можете начать воспроизведение звука. BeginStoryBoard используется вместе с анимацией, как объясняется далее в этой главе.

Трриггеры свойств - это лишь один из возможных в WPF типов триггеров. Другой тип триггеров - триггеры событий. Тргиггеры событий мы обсудим позднее в настоящей главе, когда речь пойдет об анимации.

Шаблоны

В этой главе вы уже видели, что элемент управления Button может иметь любое содержимое. Это может быть простой текст, но также вы можете добавить к кнопке элемент Canvas; этот элемент может содержать фигуры. Вы можете добавить к кнопке Grid или видеоклип. С простой кнопкой вы еще много чего можете сделать!



Функциональность и внешний вид элементов управления полностью разделены в WPF. Кнопка имеет некоторый внешний вид по умолчанию, но вы можете изменять его по своему усмотрению с помощью шаблонов.

WPF предоставляет несколько типов шаблонов, унаследованных от базового класса FrameWorkTemplate (табл. 34.10).

Таблица 34.10. Типы шаблонов, предлагаемые WPF Тип шаблона Описание

ControlTemplate С помощью ControlTemplate вы можете специфицировать ви-

зуальную структуру элемента управления и переопределить его внешность.

ItemsPanelTemplate Для ItemsControl вы можете специфицировать компоновку эле-

ментов, присваивая ItemsPanelTemplate. Каждый ItemsControl имеет ItemsPanelTemplate по умолчанию. Для MenuItem это WrapPanel. Элемент StatusBar использует DockPanel, а ListBox - VirtualizingStackPanel.

DataTemplate DataTemplate очень полезны для графического отображения объ-

ектов. Стилизуя ListBox, вы увидите, что по умолчанию элементы

ListBox отображаются согласно выводу метода ToString() .

Применяя DataTemplate, вы можете переопределить это поведение и определить собственное представление элементов списка.

HierarchicalDataTemplate HierarchicalDataTemplate используется для упорядочивания дерева объектов. Этот элемент управления поддерживает

HeaderedItemsControl, такие как TreeViewItem и MenuItem.

В следующем примере показано несколько кнопок и позднее - пошаговая настройка окон списков, так что вы сможете увидеть промежуточные результаты таких изменений. Начнем с двух очень простых кнопок, первая из которых вообще не будет иметь никакого стиля, а вторая - ссылается на стиль ButtonStyle1 с изменениями Background и FontSize. Первоначальный результат показан на рис. 34.22.

<Window x:Class= TemplateSample.Window1

xmlns= http: schemas.microsoft.com/winfx/20 06/xaml/presentation

xmlns:x= http: schemas.microsoft.com/winfx/200 6/xaml

Title= Template Sample Height= 300 Width= 300 > <Window.Resources>

<Style x:Key= ButtonStyle1 TargetType= {x:Type Button} > <Setter Property= Background Value= Yellow />

<Setter Property= FontSize Value= 18 /> </Style> </Window.Resources> <StackPanel>

<Button Name= button1 Height= 50 Width= 150 >Default Button</Button>

<Button Name= button2 Height= 50 Width= 150

Style= {StaticResource ButtonStyle1} >Styled Button

</Button> </StackPanel> </Window>

Теперь добавим в ресурсы новый стиль ButtonStyle2. Этот стиль опять устанавливает TargetType в тип Button. Класс Setter теперь специфицирует свойство Template. Указывая свойство Template, вы можете полностью изменить внешний вид кнопки. Значение свойства Template определяется элементом ControlTemplate.



1 ... 8 9 10 [ 11 ] 12 13 14 15

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика