WPF 杂谈——Trigger触发器

笔者在使用的WPF过程当中,见过的触发器有三种:Trigger、DataTrigger、EventTrigger。其中最为经常使用的要属Trigger。至于触发器的做用就是当某个属性的值发生变化,应该去作某事。固然这是笔者自身的理解。比较简单。那么这三者之间有什么不一样呢?这即是这章要讨论的目地。WPF的Style笔者喜欢把他看做CSS的样式。那么Trigger触发器大家能够理解为CSS样式中相似于:hover 伪类。这样子笔者作一个列子吧。以下,当鼠标移动在文本上面的,前景色变成为红色。字体

<Grid>
        <TextBlock Text="I am Aomi" Width="75" Height="20">
            <TextBlock.Style>
                <Style TargetType="TextBlock">
                    <Style.Triggers>
                        <Trigger Property="IsMouseOver" Value="True">
                            <Setter Property="Foreground" Value="Red" />
                        </Trigger>
                    </Style.Triggers>
                </Style>
            </TextBlock.Style>
        </TextBlock>
</Grid>

执行结果动画

鼠标移在上面spa

相信从上面的例子你至少能够明白触发器的做用。并且做用还不小呢?好了。这一点笔者就不须要在重复的去讲解了。那么DataTrigger又跟Trigger有什么区别呢?能够说做用上来说没有什么区别,可是在面向对象倒是不同子的。Trigger都是专对于控件自身的依赖属性(dependency properties)。DataTrigger是通常专对于另的控件的属性,并且都是用绑定来实现的。以下面的例子。3d

    <Grid>
        <TextBlock Text="I am Aomi" Width="75" Height="20">
            <TextBlock.Style>
                <Style TargetType="TextBlock">
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding IsMouseOver,RelativeSource={RelativeSource Self}}" Value="True">
                            <Setter Property="Foreground" Value="Red" />
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </TextBlock.Style>
        </TextBlock>
    </Grid>

那么例子的效果跟上一例子同样子。代码上面也没有多大的差异。主要是修改了触发器的写法而以。可是咱们要认识到一点:Trigger通常都是跟属性直接关联。而DataTrigger是经过绑定来关联。因此DataTrigger通常用于写另外一个控件上的属性在当前控件的触发效果。固然也能够绑定自身,如上。那么在举一个绑定另外一个控件的属性吧。以下code

<StackPanel Orientation="Vertical">
        <ToggleButton Name="Changer" Content="变红" Width="75" Height="30"></ToggleButton>
        <TextBlock Text="I am Aomi" Width="75" Height="20">
            <TextBlock.Style>
                <Style TargetType="TextBlock">
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding IsChecked, ElementName= Changer}" Value="True">
                            <Setter Property="Foreground" Value="Red" />
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </TextBlock.Style>
        </TextBlock>
    </StackPanel>

执行结果:对象

最后一个Eventtrigger通常用于动画效果的处理。上面俩个触发器做用对象都是属性。而这个倒是做用于事件的。表示当前某个事件发生后要触发。笔者本身写例子太麻烦了。就到国外复制一个例子过来讲明。以下blog

    <StackPanel Orientation="Vertical">
        <TextBlock Text="I am Aomi" HorizontalAlignment="Center">
            <TextBlock.Style>
                <Style TargetType="TextBlock">
                    <Style.Triggers>
                            <EventTrigger RoutedEvent="MouseEnter">
                                <EventTrigger.Actions>
                                    <BeginStoryboard>
                                        <Storyboard>
                                            <DoubleAnimation Duration="0:0:0.300" Storyboard.TargetProperty="FontSize" To="28" />
                                        </Storyboard>
                                    </BeginStoryboard>
                                </EventTrigger.Actions>
                            </EventTrigger>
                            <EventTrigger RoutedEvent="MouseLeave">
                                <EventTrigger.Actions>
                                    <BeginStoryboard>
                                        <Storyboard>
                                            <DoubleAnimation Duration="0:0:0.800" Storyboard.TargetProperty="FontSize" To="18" />
                                        </Storyboard>
                                    </BeginStoryboard>
                                </EventTrigger.Actions>
                            </EventTrigger>
                    </Style.Triggers>
                </Style>
            </TextBlock.Style>
        </TextBlock>
    </StackPanel>

例子的功能很简单就是当鼠标进入到文字区域的时候文字变大到28字体。若是离开就变成18字体。事件

执行效果:get

上面的触发器应该来说算是比较简单而又经常使用。但是都是单个触发条件。咱们在编写业务代码的时候,每每能够存在多个条件下的触发效果。因此上面的Trigger和DataTrigger就不能知足需求了。为了这种状况,WPF为Trigger提供了MultiTrigger,为DataTrigger提供了MultiDataTrigger。除了语法上有必定的区别之外,效果是同样子的。以下it

 <TextBlock Text="I am Aomi" Width="75" Height="20">
            <TextBlock.Style>
                <Style TargetType="TextBlock">
                    <Style.Triggers>
                        <MultiTrigger>
                            <MultiTrigger.Conditions>
                                <Condition Property="IsEnabled" Value="True" />
                                <Condition Property="IsMouseOver" Value="True" />
                            </MultiTrigger.Conditions>
                            <Setter Property="Background" Value="#4d4d4d" />
                        </MultiTrigger>
                    </Style.Triggers>
                </Style>
            </TextBlock.Style>
        </TextBlock>

从上面咱们能够看到Condition就是多条件。用法用单条件是同样子的。

执行效果:

最后让咱们看一下MultiDataTrigger的用法吧。以下

<TextBlock Text="I am Aomi" Width="75" Height="20">
            <TextBlock.Style>
                <Style TargetType="TextBlock">
                    <Style.Triggers>
                        <MultiDataTrigger>
                            <MultiDataTrigger.Conditions>
                                <Condition Binding="{Binding IsChecked,ElementName=Changer  }" Value="True" />
                                <Condition Binding="{Binding IsMouseOver,RelativeSource={RelativeSource Self} }" Value="True" />
                            </MultiDataTrigger.Conditions>
                            <Setter Property="Foreground" Value="Red" />
                        </MultiDataTrigger>
                    </Style.Triggers>
                </Style>
            </TextBlock.Style>
        </TextBlock>

执行效果:

相关文章
相关标签/搜索