欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

WPF之触发器

程序员文章站 2022-10-04 08:50:51
1. Trigger 触发器,应用属性值或有条件地执行操作; 1)触发源:控件; 2)触发条件:某属性为某个值,或执行某个事件时; 3)执行操作:更改某个属性值或执行某个事件; 4)举例:当窗口加载时(执行某个事件时),以动画的形式将窗口的大小倍数从 0 到 1 展示(执行某个事件)。 2. Tri ......

1. trigger

触发器,应用属性值或有条件地执行操作;
1)触发源:控件;
2)触发条件:某属性为某个值,或执行某个事件时;
3)执行操作:更改某个属性值或执行某个事件;
4)举例:当窗口加载时(执行某个事件时),以动画的形式将窗口的大小倍数从 0 到 1 展示(执行某个事件)。

 

2. trigger 的分类

1)根据触发器的触发条件,在 wpf 中,触发器的形态可以是:trigger、datatrigger、eventtrigger;
2)以及由 trigger 延伸的 multitrigger 和由 datatrigger 延伸的 multidatatrigger;

2.1 trigger

trigger 主要用于监测依赖项属性的变化,然后使用设置器改变样式

 
// 例子1:
<button foreground="red" width="350" content="效果">
    <button.style>
        <style targettype="{x:type button}">
            <setter property="height" value="200"/>
            <style.triggers>
                <!--触发条件:当焦点属性的值为 true 时-->
                <trigger property="isfocused" value="true">
                    <!--使用设置器更改样式-->
                    <setter property="height" value="300"/>
                </trigger>
            </style.triggers>
        </style>
    </button.style>
</button>

// 例子2:
<button  foreground="red" width="350" content="效果">
    <button.style>
        <style targettype="{x:type button}">
            <style.triggers>
                <trigger property="isfocused" value="true">
                    <setter property="background" value="blue"></setter>
                    <trigger.enteractions>
                        <!--启动动画并将动画分发给目标对象和属性-->
                        <beginstoryboard>
                            <storyboard>
                                <doubleanimation storyboard.targetproperty="width" 
                                    to="500" duration="0:0:4"/>
                            </storyboard>
                        </beginstoryboard>
                    </trigger.enteractions>
                </trigger>                            
            </style.triggers>
        </style>
    </button.style>
</button>

2.2 datatrigger

跟 trigger类似,只是它可以绑定到任意数据的变化

<button  foreground="red" width="350" content="效果">
    <button.style>
        <style targettype="{x:type button}">
            <style.triggers>
                <!--触发条件:当 name 值为 bt 的控件的焦点属性值为 true 时-->
                <datatrigger binding="{binding isfocused, elementname=bt}" value="true">
                    <setter property="background" value="blue"></setter>
                    <datatrigger.enteractions>
                        <!--同样的,启动动画并将动画分发给目标对象和属性-->
                        <beginstoryboard>
                            <storyboard>
                                <doubleanimation storyboard.targetproperty="width" 
                                    from="100" to="500" duration="0:0:4"/>
                            </storyboard>
                        </beginstoryboard>
                    </datatrigger.enteractions>
                </datatrigger>                            
            </style.triggers>
        </style>
    </button.style>
</button>

2.3 eventtrigger

表示应用设置事件以响应操作的触发器,窗口加载时执行动画就是用 eventtrigger 实现的;

<button>
    <button.style>
        <style targettype="{x:type button}">
            <style.triggers>
                <!--事件触发器:当 window 加载时,触发-->
                <eventtrigger routedevent="window.loaded">
                    <eventtrigger.actions>
                        <!--同样的,启动动画并将动画分发给目标对象和属性-->
                        <beginstoryboard>
                            <storyboard>
                                <doubleanimation storyboard.targetproperty="width" from="0" to="100" duration="0:0:0.2"/>
                            </storyboard>
                        </beginstoryboard>
                    </eventtrigger.actions>
                </eventtrigger>
            </style.triggers>
        </style>
    </button.style>
</button>

2.4 multitrigger

trigger 类似。联合了多个条件,只有满足了所有这些条件,才会启动触发器。

<button>
    <button.style>
        <style targettype="{x:type button}">
            <style.triggers>
                <multitrigger>
                    <!--当 content、ismouseover 这两个属性为设置的值时,才会触发该触发器-->
                    <multitrigger.conditions>
                        <condition property="content" value="效果"></condition>
                        <condition property="ismouseover" value="true"></condition>
                    </multitrigger.conditions>
                    <multitrigger.setters>
                        <setter property="foreground" value="red"></setter>
                    </multitrigger.setters>
                </multitrigger>
            <style.triggers>
        <style targettype="{x:type button}">
    <button.style>
<button>

multidatatrigger 可以参考 datatrigger 和 multitrigger 即可。

..

2.5 补充

1)style.triggers 跟 control.triggers 的区别:

像上面,可以往 style.trigger 里添加 trigger、datatrigger、eventtrigger,
但只能往控件里面的 triggers 添加 eventtrigger:

<button>
    <button.triggers>
        <eventtrigger routedevent="window.loaded">
            <eventtrigger.actions>
                <beginstoryboard>
                    <storyboard>
                        <doubleanimation storyboard.targetproperty="width" from="0" to="100" duration="0:0:0.2"/>
                    </storyboard>
                </beginstoryboard>
            </eventtrigger.actions>
        </eventtrigger>
    </button.triggers>
</button>
2)触发器设置样式无效,可能原因:

在控件标签中,已对控件设置过该属性的值。
具体解释:

style 是应用样式给控件,它的优先级低于直接对控件操作的设置,例如:

<button width="350" content="效果">
    <button.style>
        <style targettype="{x:type button}">
            <style.triggers>
                <trigger property="isfocused" value="true">
                    <!--button 本身已经对 width 设置过值,这里的触发器不会生效-->
                    <setter property="width" value="100"/>
                </trigger>
            </style.triggers>
        </style>
    </button.style>
</button>
3)trigger 、 datatrigger、eventtrigger 负责<触发器执行>的属性

trigger 、 datatrigger 可以是 enteractions、exitactions,

enteractions 是触发对象变为活动状态时,通俗来说,就是当该属性的值成为你设置的值时,开始触发器执行,强调的是成为的瞬间;
而 exitactions 是反过来,当触发对象变为非活动状态时,即当该属性的值从你设置的值到别的值,这个瞬间,开始触发器执行。

而 eventtrigger 的是 actions,它的时机在发生事件时。

这个可以根据他们的触发条件,慢慢体会体会,先学会用。


原文: