作者:
邓崇富
撰写时间:
2019
年 6 月 27 日
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
使用触发器,可以动态地更改控件的外观,因为一些事件或属性值该变了。例如,用户把鼠标移到按钮上,按钮就会改变其外观。通常,这必须在C#代码中实现。使用WPF,也可以用XAML实现,而这会影响UI。
XAML有几个触发器。属性触发器在属性值改变时激活。多触发器基于多个属性值。事件触发器在事件发生时激活。数据触发器在绑定的数据改变时激活。
属性触发器:
Style类有一个Trigger属性,通过它可以指定属性触发器。下面的示例将一个Button元素放在一个Grid面板中,利用Window资源定义Button元素的默认样式。这样式指定,将Background属性设置为LigthBlue,将FontSisze属性设置为17.这是应用程序启动时Button元素的样式。使用触发器可以改变控件的样式。触发器在Style.Trigger元素中应用Trigger元素定义。将一个触发器赋予IsMouseOver属性,另一个触发器赋予IsPressed属性。这两个属性通过应用了样式的Button类定义。如果IsMouseOver属性的值是True,就会激活触发器,将Foreground属性设置为Red,将FontSize属性设置为22。如果按下该按钮,,IsPressed属性就是true,激活第二个触发器,并将TextBox的Foreground属性设置为Yellow。
详细代码如下:
<!--
窗口样式-->
<
Window.Resources
>
<
Style
TargetType
="Button">
<
Setter
Property
="Background"
Value
="LightBlue"/>
<
Setter
Property
="FontSize"
Value
="17"/>
<!--
触发器-->
<
Style.Triggers
>
<!--
鼠标移到按钮上的触发事件-->
<
Trigger
Property
="IsMouseOver"
Value
="True">
<
Setter
Property
="Foreground"
Value
="Red"/>
<
Setter
Property
="FontSize"
Value
="22"/>
</
Trigger
>
<!--
鼠标按下按钮时的触发事件-->
<
Trigger
Property
="IsPressed"
Value
="True">
<
Setter
Property
="Foreground"
Value
="Yellow"/>
<
Setter
Property
="FontSize"
Value
="22"/>
</
Trigger
>
</
Style.Triggers
>
</
Style
>
</
Window.Resources
>
<!--
按钮-->
<
Button
Width
="200"
Height
="30"
Content
="
点我!"/>
</
Grid
>
效果如下图:
当激活触发器的原因不再有效时,就不必将属性值重置为原始值。例如,不必定义IsMouseOver =true和IsMouseOver = false的触发器。只要激活触发器的原因不再有效,触发器操作进行的修改就会自动重置为原始值。
Trigger类定义了下面表中的属性,以指定触发器操作。
|
Trigger属性
|
说明
|
|
Property value
|
使用属性触发器,Property和Value属性用于指定触发器的激活时间,例如,Property="IsMouseOver" Value="True"
|
|
Setters
|
一旦激活触发器,就可以使用Setters元素集合,来改变属性值,Setter类定义Property.TargetName和Value属性,已修改对象属性
|
|
EnterActions ExitActions
|
除了定义Setters之外,还可以定义EnterActions和ExitActions。使用这两个属性,可以定义一个TargetName元素集合. EnterActions在启动触发器时激活(此时通过属性触发器应用Property/Value组合)。ExitActions在触发器激活结束之前激活(此时不再应用Property/Value组合),用这些操作指定的触发器操作派生自基类TriggerAction,如SoundPlayerAction和BeginStoryboard。使用SoundPlayerAction基类可以开始播放声音,BeginStoryboard基类用于动画。
|
多触发器:
属性的值变化时,就会激活属性触发器,如果因为两个或多个属性有特定的值,而需要设置触发器,就可以使用MultiTrigger。
MultiTrigger有一个Conditions属性,可以在其中设置属性的有效值。它还有一个Setters属性,可以其中指定需要设置的属性。在下面的示例中,给TextBox元素定义了一个样式,如果IsEnabled属性是True,Text属性的值是Test,就应用触发器。如果应用这两个触发器,就把TextBox的Foreground属性设置为Red:
<!--
窗口样式-->
<
Window.Resources
>
<
Style
TargetType
="TextBox">
<
Setter
Property
="Margin"
Value
="15"/>
<
Style.Triggers
>
<
MultiTrigger
>
<
MultiTrigger.Conditions
>
<
Condition
Property
="IsEnabled"
Value
="True"/>
<
Condition
Property
="Text"
Value
="Test"/>
</
MultiTrigger.Conditions
>
<
MultiTrigger.Setters
>
<
Setter
Property
="Foreground"
Value
="Red"/>
</
MultiTrigger.Setters
>
</
MultiTrigger
>
</
Style.Triggers
>
</
Style
>
</
Window.Resources
>
<!--
按钮-->
<
TextBox
/>
</
Grid
>
数据触发器:
如果绑定到控件上的数据满足制定条件,就激活数据触发器。下面的例子使用Book类,Book类定义Title和Publisher属性,还重载ToString()方法:
public
class
Book
public
string
Title {
get
;
set
; }
public
string
Publisher {
get
;
set
; }
public
override
string
ToString()
return
Title;
在XAML代码中,给ListBoxItem元素指定了一个样式。改样式包含DataTrigger元素,它绑定到用于列表项的类的
Publisher
属性上。如果Publisher属性的值是Wrox Press,Background就设置为Red。把Background分别设置为Yellow和LightBlue:
<!--
窗口样式-->
<
Window.Resources
>
<
Style
TargetType
="ListBoxItem">
<
Style.Triggers
>
<
DataTrigger
Binding
="{
Binding
Publisher
}"
Value
="Wrox Press">
<
Setter
Property
="Background"
Value
="Red"/>
</
DataTrigger
>
<
DataTrigger
Binding
="{
Binding
Publisher
}"
Value
="Dummies">
<
Setter
Property
="Background"
Value
="Yellow"/>
</
DataTrigger
>
<
DataTrigger
Binding
="{
Binding
Publisher
}"
Value
="Wiley">
<
Setter
Property
="Background"
Value
="DarkGray"/>
</
DataTrigger
>
</
Style.Triggers
>
</
Style
>
</
Window.Resources
>
<!--
界面-->
<
ListBox
x
:
Name
="list1"/>
</
Grid
>
在XAML的后台代码中,把列表list1初始化为包含几个Book对象:
public
partial
class
MainWindow
: Window
public
MainWindow()
InitializeComponent();
list1.Items.Add(
new
Book
Title =
"professional C# 4.0 and .NET 4"
,Publisher =
"Wrox Press"
list1.Items.Add(
new
Book
Title =
"C# 2019 for Dummies"
,
Publisher =
"For Dummies"
list1.Items.Add(
new
Book
Title =
"HTML and CSS:Design and Buid Websites"
,
Publisher =
"Wiley"
运行应用程序后,ListBoxItem元素就会根据
Publisher
的值进行格式化,如下图:
使用DataTrigger时,必须给MultiDataTrigger设置多个属性(类似于Trigger和MultiTrigger)。
Represents a
trigger
that applies property values or performs actions when the bound data meets a specified condition.
某词典的翻译:
当绑定的数据满足指定的条件时,应用(指定的)属性或执行操作的
触发器
下面我演示一...
今天在做一个小Demo的时候碰到了一个比较奇怪的问题,就是其
中
一个
Trigger
始终无法执行,<
Trigger
Property="Popup.IsOpen" Value="False">就是当Popup控件关闭的时候不能触发<Setter TargetName="BG" Property="Background" Value="Gray" />这个状态,首先贴一下...
刚接触WPF不久,很多地方都还不了解。这个问题困扰了我有些日子了,今天终于找到了解决的办法。希望能帮到有需要的人。
开始用
Trigger
的时候觉得很麻烦,尤其是想设置其他控件的属性时,总是提示
Trigger
s下必须是Event
Trigger
或者说不能设置TargetName属性之类的。
我想做一个
触发器
,目的是改变某个控件的Visibility属性。弄了半天都不行,最后只能用笨方法,给那个控件
Style 直译过来就是“风格”、“样式”。是通过改变一些属性值的搭配来
实现的。如果把WPF窗体看做一个舞台,那么窗体上的控件就是一个个演
员,它们的职责就是在用户界面上按照业务逻辑的需要扮演自己的角色。为了让同一种
控件能担当起不同的角色,程序员就要为它们设计多种外观样式和行为动作,这就是
Style。构成Style最重要的两种元素是Setter和
Trigger
,Setter类帮助我们设置控件的静态
外观风格,
Trigger
类则帮助我们设置控件的行为风格。
Style
中
的Setter
Setter,设置
3、由数据触发的Data
Trigger
程序
中
经常会遇到基于数据执行某些判断情况,遇到这种情况时我们可以考虑使用 Data
Trigger
。Data
Trigger
对象的Binding属性会把数据源源不断送过来,一旦送来的值与Value属性一致,Data
Trigger
即被触发。
下面例子
中
,当TextBox的Text长度小于7个字符时其Border会保持红色。
XAML
代码如下:
这个例子
中
唯一需要解释的就是
资源是可以在应用程序的不同位置重用的对象。
XAML
资源的示例包括画笔和样式。每个
框架级别的元素(FrameworkElement或FrameworkContentElement)都有一个resource属
性,该属性包含资源定义的资源(作为ResourceDictionary)。可以在任何元素上定义资
源,但是资源通常是在根元素上定义的。当在页面根元素上定义一个资源时,页面逻辑
树
中
的所有元素都可以访问它,并且您可以重用相同的资源来设置接受该资源表示的类
型的任何属性的值
初学WPF,知道一些控件,可以通过定义Style的
Trigger
改变要显示的样式,但是经常遇到一些明明
Trigger
已经触发了,但是里面Setter设置的样式,却没有效果的问题。其实主要原因,是样式重复定义导致的。
举个例子:
<i:Interaction.
Trigger
s>
<i:Event
Trigger
EventName=“MouseEnter”>
<i:InvokeCommandAction Command="{Binding MouseEnterCommand}"/>
</i:Event
Trigger
>
</i:Interaction.
Trigger
s>
<TextBlock FontSize
利用 WPF 的
Trigger
系统,也可以很简单的只使用xmal实现三态按钮。在Window或UserControl的资源
中
声明按钮的style并加入触发功能。使用的时候直接在button里复写style就可以了,废话不多说,直接上代码:<UserControl.Resources>
<Style x:Key="threeStateButton" Targe...
1 使用附加属性来添加动画
public static readonly DependencyProperty AniInvokePropery = DependencyProperty.RegisterAttached("AniInvoke", t...
WPF
中
有种叫做
触发器
的东西(记住不是数据库的
trigger
哦)。它的主要作用是根据
trigger
的不同条件来自动更改外观属性,或者执行动画等操作。
WPF
trigger
的主要类型有:
Trigger
、Multi
Trigger
、Data
Trigger
、MultiData
Trigger
、Event
Trigger
几种。从字面意思上我们想大家已经知道个大概,接下来我将还会用实例代码逐一进行介绍。trig
今天上班时候 写一个很简单的事件触发事件,发现mousedown 事件死活触发不了。 后面找了一下原因, 原来坑爹的跟书写的顺序有关系, 如果
mouse down 写在第一个,就只能触发mouse move 不能触发 down 只能按顺序, 先写move 再写down 才能按照顺序触发。 不知道是不是微软的一个bug。
正确的做法就是把顺序交换一下