Собственнов в этом определении сказано все, что нужно для понимания идеи триггеров.
Есть состояние -> происходит событие -> состояние меняется.
Посмотрим простенький пример:
- <Style TargetType="{x:Type TextBox}">
- <Setter Property="TextBox.Background">
- <Setter.Value>
- <LinearGradientBrush StartPoint="0.5,0" EndPoint="0.5,1">
- <GradientStop Offset="0.0" Color="LightCyan" />
- <GradientStop Offset="0.14" Color="Cyan" />
- <GradientStop Offset="0.7" Color="DarkCyan" />
- </LinearGradientBrush>
- </Setter.Value>
- </Setter>
- <Style.Triggers>
- <Trigger Property="IsFocused" Value="True">
- <Setter Property="TextBox.Background">
- <Setter.Value>
- <LinearGradientBrush StartPoint="0.5,0" EndPoint="0.5,1">
- <GradientStop Offset="0.0" Color="LightSeaGreen" />
- <GradientStop Offset="0.14" Color="SeaGreen" />
- <GradientStop Offset="0.7" Color="DarkSeaGreen" />
- </LinearGradientBrush>
- </Setter.Value>
- </Setter>
- </Trigger>
- </Style.Triggers>
- </Style>
* This source code was highlighted with Source Code Highlighter.
Итак, в первой строке задается картинка, для которой во второй строке мы открываем задание набора тригеров. Тригеры у нас заданы в строках 3 и 11. Превый привязан к событию захода мышки в компонент, второй к покиданию мышкой компонента.
В связи с тем, что свойство Width компонента Image имеет тип double мы и применяем в строках 6 и 14 DoubleAnimation. Задав целевое свойство (Storyboard.TargetProperty), продолжительность анимации (Duration) и к какому значению надо привести (To). В результете при навидении мышки на картинку она будет увеличиваться в размере.
Т.к. для каждой картинки в приложении особенно этого не наделаешься, то само собой можно применить стиль...
Например, вот такой:
- <Style TargetType="{x:Type Image}">
- <Setter Property="Image.Width" Value="100"></Setter>
- <Style.Triggers>
- <EventTrigger RoutedEvent="Image.MouseEnter">
- <BeginStoryboard>
- <Storyboard >
- <DoubleAnimation Storyboard.TargetProperty="Width" BeginTime="00:00:00" Duration="00:00:01" From="100" To="200">
- </DoubleAnimation>
- </Storyboard>
- </BeginStoryboard>
- </EventTrigger>
- <EventTrigger RoutedEvent="Image.MouseLeave">
- <BeginStoryboard>
- <Storyboard >
- <DoubleAnimation Storyboard.TargetProperty="Width" BeginTime="00:00:00" Duration="00:00:01" To="100">
- </DoubleAnimation>
- </Storyboard>
- </BeginStoryboard>
- </EventTrigger>
- </Style.Triggers>
- </Style>
* This source code was highlighted with Source Code Highlighter.
Теперь все картинки не имеющие переопределений стиля по умолчании будут иметь ширину 100, при наведнии мышки уширяться ;), а при покидании сжиматься...
Не претендуя на изыски можно, например, вот так организовать галлерею:
- <StackPanel Orientation="Horizontal">
- <Image Source="Chrysanthemum.jpg"></Image>
- <Image Source="Desert.jpg"></Image>
- <Image Source="Hydrangeas.jpg"></Image>
- <Image Source="Jellyfish.jpg"></Image>
- <Image Source="Koala.jpg"></Image>
- <Image Source="Lighthouse.jpg"></Image>
- <Image Source="Penguins.jpg"></Image>
- <Image Source="Tulips.jpg"></Image>
- </StackPanel>
* This source code was highlighted with Source Code Highlighter.
Ну а в случае, когда нам анимация изменения не нужна, можно применять "не евентовые" тригеры, которые отслеживают изменение свойтсв:
- <Style TargetType="{x:Type TextBox}">
- <Setter Property="TextBox.Background">
- <Setter.Value>
- <LinearGradientBrush StartPoint="0.5,0" EndPoint="0.5,1">
- <GradientStop Offset="0.0" Color="LightCyan" />
- <GradientStop Offset="0.14" Color="Cyan" />
- <GradientStop Offset="0.7" Color="DarkCyan" />
- </LinearGradientBrush>
- </Setter.Value>
- </Setter>
- <Style.Triggers>
- <Trigger Property="IsFocused" Value="True">
- <Setter Property="TextBox.Background">
- <Setter.Value>
- <LinearGradientBrush StartPoint="0.5,0" EndPoint="0.5,1">
- <GradientStop Offset="0.0" Color="LightSeaGreen" />
- <GradientStop Offset="0.14" Color="SeaGreen" />
- <GradientStop Offset="0.7" Color="DarkSeaGreen" />
- </LinearGradientBrush>
- </Setter.Value>
- </Setter>
- </Trigger>
- </Style.Triggers>
- </Style>
* This source code was highlighted with Source Code Highlighter.
Интерес представляют строки с 11 по 23. Как видно в строке 12 задается тригер который отслеживает состояние свойства IsFocused и как только оно станет равно True к TextBox-у будут применен новый Setter. Причем в данном случае заботиться об обратной смене значений не необходимости. При возврате свойства IsFocused в false значение Setter-а будет отменено и фон станет таким каким был по умолчанию.
Комментариев нет:
Отправить комментарий