WPF – 使用触发器

·         属性触发器Property Trigger:当Dependency Property的值发生改变时触发。

·         数据触发器Data Trigger 当普通.NET属性的值发生改变时触发。

·         事件触发器Event Trigger 当路由时间被触发时调用。

参见:http://www.cnblogs.com/zlgcool/archive/2008/10/29/1322382.html# 

事件触发器 代码:

<StackPanel Margin="20" >

<!-- This rectangle is animated. -->
<Rectangle Name="myRectangle"
Width
="100" Height="20" Margin="12,0,0,5" Fill="#AA3333FF"
HorizontalAlignment
="Left" />

<!-- This StackPanel contains all the Buttons. -->
<StackPanel Orientation="Horizontal" Margin="0,30,0,0">

<Button Name="BeginButton">Begin</Button>
<Button Name="PauseButton">Pause</Button>
<Button Name="ResumeButton">Resume</Button>
<Button Name="SkipToFillButton">Skip To Fill</Button>
<Button Name="SetSpeedRatioButton">Triple Speed</Button>
<Button Name="StopButton">Stop</Button>

<StackPanel.Triggers>

<!-- Begin the Storyboard -->
<EventTrigger RoutedEvent="Button.Click" SourceName="BeginButton">
<BeginStoryboard Name="MyBeginStoryboard">
<Storyboard>
<DoubleAnimation
Storyboard.TargetName="myRectangle"
Storyboard.TargetProperty
="(Rectangle.Width)"
Duration
="0:0:5" From="100" To="500" />
</Storyboard>
</BeginStoryboard>
</EventTrigger>

<!-- Pause the Storyboard -->
<EventTrigger RoutedEvent="Button.Click" SourceName="PauseButton">
<PauseStoryboard BeginStoryboardName="MyBeginStoryboard" />
</EventTrigger>

<!-- Resume the Storyboard -->
<EventTrigger RoutedEvent="Button.Click" SourceName="ResumeButton">
<ResumeStoryboard BeginStoryboardName="MyBeginStoryboard" />
</EventTrigger>

<!-- Skip to Fill -->
<EventTrigger RoutedEvent="Button.Click"
SourceName
="SkipToFillButton">
<SkipStoryboardToFill BeginStoryboardName="MyBeginStoryboard" />
</EventTrigger>

<!-- Stop the Storyboard -->
<EventTrigger RoutedEvent="Button.Click" SourceName="StopButton">
<StopStoryboard BeginStoryboardName="MyBeginStoryboard" />
</EventTrigger>

<!-- Triple the speed of the Storyboard -->
<EventTrigger RoutedEvent="Button.Click"
SourceName
="SetSpeedRatioButton">
<SetStoryboardSpeedRatio SpeedRatio="3"
BeginStoryboardName
="MyBeginStoryboard" />
</EventTrigger>
</StackPanel.Triggers>
</StackPanel>

</StackPanel> 

 

=========================================================================

http://zjysky.blog.hexun.com/49463729_d.html

文章主要说样式中事件EventSetter和触发器trigger

1.EventSetter
EventSetter这个理解比较简单,就是给样式使用者添加一个事件,比如给按钮添加点击事件,提供了另外一个方式来给控件添加事件
比如这个style
 <Style TargetType="Button">
                <Setter Property="FontSize" Value="40"></Setter>
                <EventSetter  Event="Click" Handler="xx"></EventSetter>
            </Style>
定义了一个button的style,设置字体大小
EventSetter  就是事件设置,event表示是什么事件,handler表示该事件关联哪个方法
这样的话就是说本window内的所有button都有有点击事件交给xx方法来处理

2.trigger触发器

trigger这个也是style的属性之一,触发器顾名思义就是在使用style样式的元素或者控件的某些属性发生变化的时候才会触发这个事件
trigger就定义了元素或者控件如何响应特点属性发生变化时候进行处理,比如用户输入等等,鼠标移动
典型的trigger这样定义
 <Style TargetType="Button">
                <Setter Property="FontSize" Value="40"></Setter>
                <EventSetter  Event="Click" Handler="xx"></EventSetter>
                <Style.Triggers>
                    <Trigger Property="IsMouseOver" Value="true">
                        <Setter Property="FontSize" Value="20"></Setter>
                        <Setter Property="Foreground" Value="blue"></Setter>
                    </Trigger>
                </Style.Triggers>
            </Style>
trigger仍在在style中定义。这个定义表示,当button有IsMouseOver的这个属性变化成True的时候,会开始对他的fontsize和foreground的属性发生变化
通过运行vs就会发现,鼠标在button上停留的时候button的字体大小会变小而且颜色会变蓝色,鼠标离开以后就会恢复回来

3.MultiTrigger
多触发器,这个意思是说只有在两个或者两个以上的属性发生变化的时候才会引发触发器,不像之前的例子一个属性变化就会引发触发器
典型语法,仍然在style中
<style>
 <Style.Triggers>
 <MultiTrigger>
                        <MultiTrigger.Conditions>//罗利条件,条件的集合,
                            <Condition Property="IsPressed" Value="true"></Condition>
                            <Condition Property="IsMouseOver" Value="true"></Condition>
                        </MultiTrigger.Conditions>
                        <Setter Property="FontStyle" Value="Italic"></Setter>//在以上条件下才发生的属性变化
                    </MultiTrigger>
</ <Style.Triggers>>
</style>

4.datatrigger

数据触发和trigger类似,不同的是 binding代替了property属性
<style>
< Style.Triggers>
<DataTrigger Binding="{Binding ElementName=tb,Path=Text.Length}" Value="0">
                        <Setter Property="IsEnabled" Value="false"></Setter>
                    </DataTrigger>
 </Style.Triggers>
</style>
这个绑定设置到了一个textbox文本控件,如果textbox控件内容为空的时候,就会引发按钮isenabled=false
当然默认启动的时候textbox内容就是为空,所以初始化的时候按钮的isenabled=false,只有文本框内容输入内容的时候按钮的isenabled才等true

此外还有一个MultiDataTrigger,可以参考3,其实一样的

原文地址:https://www.cnblogs.com/star250/p/2104678.html