当前位置:Gxlcms > 数据库问题 > WPF触发器(非数据库中的触发器)

WPF触发器(非数据库中的触发器)

时间:2021-07-01 10:21:17 帮助过:4人阅读

ButonStyle" TargetType="Button"> <Style.Triggers> <Trigger Property="IsMouseOver" Value="True"> <Trigger.EnterActions> <BeginStoryboard> <Storyboard> <DoubleAnimation Storyboard.TargetProperty="Opacity" To="0.25" Duration="0:0:1"/> </Storyboard> </BeginStoryboard> </Trigger.EnterActions> <Trigger.ExitActions> <BeginStoryboard> <Storyboard> <DoubleAnimation Storyboard.TargetProperty="Opacity" To="1" Duration="0:0:1"/> </Storyboard> </BeginStoryboard> </Trigger.ExitActions> </Trigger> </Style.Triggers> </Style>

上面这段样式表示,当鼠标移上的时候,Button变得不透明,离开后又逐渐恢复原样。

四、Setter类的使用

          Setter类是非常容易使用的。它具有三个常用的属性:TargetName,Property和Value。这三个属性分别表示需要设置属性所在实例的名称、需要进行设置的属性和需要将该属性设置的值。但需要注意的是,被设置的属性必须是关联属性。当Trigger或Style中设置了TargetType的时候,XAML可以直接指定需要设置的属性而省略对象的类型。但在没有指定TargetType的情况下,Setter中对TargetType类型的Property属性的设置就必须使用TargetType.Property的形式。例如,当需要使用Setter元素设置按钮控件的背景颜色为蓝色时,软件开发人员就可以使用下面的XAML语句:

<Setter Property="Button.Background" Value="Blue"/> 
从MSDN对Setter类的基类SetterBase的介绍中可以看到,Setter类的基类SetterBase不只有一个派生类。除了Setter类之外,SetterBase类的派生类还有一个EventSetter类。EventSetter类用来完成对事件处理函数的定义。例如,若想让一个Button类实例在鼠标移动到其上时运行OnMouseEnter函数,软件开发人员就可以使用下面的代码:
<EventSetter Event="Button.MouseEnter" Handler="OnMouseEnter"/>

EventSetter无疑是一个不太友好的设计。而且在不同地方使用不同的EventSetter的情况下,软件开发人员并没有一个好的办法判断各个事件处理函数被执行的先后次序。而在一个以事件作为驱动的程序中,无法对事件响应函数的执行顺序进行控制无疑是一件最危险的事情。

五、各种触发器的使用

1.属性触发器

首先来看看属性触发器。属性触发器在指定的属性具有指定的值时,执行它所包含的一系列Setter完成对其他属性的设置。而当该属性不再是该指定值时,所有的属性设置将被恢复到前一状态。

样式: 
<Style x:Key="TextBoxStyle1" TargetType="TextBlock"> <Style.Triggers> <Trigger Property="Text" Value="text"> <Setter Property="Background" Value="Aqua"/> </Trigger> </Style.Triggers> </Style> 应用: <TextBlock Width="50" Style="{StaticResource TextBoxStyle1}" Text="text"> </TextBlock>

 

在包含上例代码的程序中,如果用户在文本输入框中输入"text",输入框的背景颜色将变成绿色。完成这种控制逻辑的就是在Style中定义的属性触发器Trigger。在Trigger的声明中,对Trigger各属性的设置声明了Trigger被触发的条件:当Text属性为字符串"text"的时候,执行Setter中对属性的设置,即将背景颜色变成绿色。

4.数据触发器

除了Trigger类可以用来侦听属性的变化外,软件开发人员还可以使用DataTrigger完成对任意类型的CLR数据变化的侦听。因此,DataTrigger类不仅可以完成Trigger类的所有功能,更可以运行非关联属性的更改触发逻辑。DataTrigger类一共引入了三个参数:Binding,Value和Setters。当需要设置数据触发器侦听的数据源时,软件开发人员应该以通过绑定对Binding属性赋值的方式来完成。即如果需要使用DataTrigger完成上面对TextBox背景颜色进行更改的功能。

        <Style x:Key="TextBoxStyle2" TargetType="TextBox">
            <Style.Triggers>
                <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=Text}" Value="123">
                    <Setter Property="Background" Value="Red"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>

需要注意的是:虽然软件开发人员可以使用DataTrigger完成对任意CLR类型数据变化的侦听,但Setter只能对关联属性进行设置。并且XAML不能在Setter中对Style属性进行更改。其原因是:触发器可以在样式中进行定义。当一个在样式中定义的触发器更改了其所在实例的样式时,WPF怎么继续处理触发器中剩余的设置?为了避免这个问题,WPF禁止在触发器中对样式进行设置。

5.事件触发器

WPF中还提供另一种触发器。该触发器的触发条件就是一个事件的发生。该触发器所对应的类为EventTrigger,即事件触发器。该类从TriggerBase类派生后只添加了三个属性:Actions,RoutedEvent和SourceName。软件开发人员可以通过SourceName属性指定激活该触发器的元素名称。而RoutedEvent属性则记录激活该触发器的事件。Actions是一个只读属性,表示触发器被触发时需要执行的动作。

                <EventTrigger RoutedEvent="Mouse.MouseEnter">
                    <EventTrigger.Actions>
                        <BeginStoryboard>
                            <Storyboard>
                                <DoubleAnimation
                                          Duration="0:0:0.2"
                                          Storyboard.TargetProperty="Width"
                                          To="65"  />
                            </Storyboard>
                        </BeginStoryboard>
                    </EventTrigger.Actions>
                </EventTrigger>

 

6.或逻辑触发器

当需要表示或逻辑关系时,软件开发人员可以简单地将多个触发器并列。当某一个触发器所标识的条件满足时,该触发器所包含的行为将执行,导致使用这个触发器的用户界面元素实例的属性改变。如果在前面的例子中,软件设计师不仅希望TextBox 的背景颜色在用户输入为"text"时为绿,也希望背景在用户输入为"text."时为绿,示例如下:

 

<TextBox TextWrapping="Wrap" Margin="5">
<TextBox.Style>
<Style TargetType="TextBox">
<Style.Triggers>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=Text}"Value="text">
<Setter Property="Background" Value="Red"/>
</DataTrigger>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=Text}" Value="text.">
<Setter Property="Background" Value="Blue"/>
</DataTrigger>
</Style.Triggers>
</Style>
</TextBox.Style>
</TextBox>

 

在或逻辑关系中,触发器的各属性匹配可能在同一时间被满足。在这种情况下,触发器对状态的设置同时生效。在各个触发器对属性的设置发生冲突时,WPF将按照后声明的触发器所制定的规则对属性进行设置。如下:

<Button Content="Press Me!">
<Button.Style>
<Style TargetType="{x:Type Button}">
<Style.Triggers>
<Trigger Property="Button.IsMouseOver" Value="True">
<Setter Property="Button.Foreground" Value="Blue"/>
</Trigger>
<Trigger Property="Button.IsPressed" Value="True">
<Setter Property="Button.Foreground" Value="Red"/>
</Trigger>
</Style.Triggers>
</Style>
</Button.Style>
</Button>

当用户将鼠标移动到按钮上面并使用左键对按钮进行点击的时候,按钮的颜色将是红色,而不是蓝色。因为在按钮被按下之前,IsMouseOver属性的值为True,而在按钮被按下时IsPressed属性的值也变为True,所以按照后声明优先的决定方式,WPF将设置该按钮的背景颜色为红色。

7.与逻辑触发器

如果要表示与逻辑关系,软件开发人员就需要使用MutiTrigger或MutiDataTrigger。在使用这两种触发器时,软件开发人员需要向它们的Conditions集合中添加触发条件。假设软件需要下面一种功能:当TextBox中所记录的字符串是"text"并且鼠标在TextBox之上时,TextBox的背景颜色将变成绿色。示例如下:

<TextBox TextWrapping="Wrap" Margin="5">
<TextBox.Style>
<Style TargetType="TextBox">
<Style.Triggers>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="Text" Value="text"/>
<Condition Property="IsMouseOver" Value="True"/>
</MultiTrigger.Conditions>
<Setter Property="Background" Value="Aqua"/>
</MultiTrigger>
</Style.Triggers>
</Style>
</TextBox.Style>
</TextBox>

 

WPF触发器(非数据库中的触发器)

标签:tps   click   red   实例   cond   集合   后台   bsp   class   

人气教程排行