当前位置: 移动技术网 > IT编程>开发语言>.net > WPF之触发器

WPF之触发器

2020年04月28日  | 移动技术网IT编程  | 我要评论

win7和vista,深圳人才市场最新招聘信息,吴裕泰茶叶礼盒

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,它的时机在发生事件时。

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


原文: 


 

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网