样式和行为
样式是组织和重用格式化选项的重要工具,不是使用重复的标记填充XAML。
行为是一款重用用户界面的更有挑战性的工具。基本思想是:使用行为封装一些通用的UI功能。
引入.Net名称空间System映射到XAML名称空间的前缀sys
xmlns:sys="clr-namespace:System;assembly=mscorlib"
每一个Style对象是一个Setter对象的集合。每一个Setter对象设置元素的单个属性。唯一的限制是设置器只能改变依赖项属性,不能修改其他属性。
Style类中有五个总要的属性
Setters:设置属性以及自动关联事件处理程序的Setter对象或者EventSetter对象
Triggers:继承制TriggerBase类并能自动改变样式设置的对象集合
Resources:希望用于样式的资源集合。例如,可能需要使用一个对象设置多个属性。
BaseOn:通过该属性可创建继承自其他样式设置的更具体样式
TargetType:该属性标示应用样式的元素类型。
在某些情况下,不能使用简单的特性字符串设置属性值。不能使用字符串设置ImageBrush对象,但是可以使用嵌套。
为了表示希望设置的属性,需要提供类和属性的名称。
这样设置的一些问题
<Style x:Key="txtbtnStyle">
<Setter Property="Button.FontFamily" Value="Times New Roman"/>
<Setter Property="TextBlock.FontFamily" Value="Arial"/>
</Style>
这样做并不会得到想要的效果,问题在于Button.FontFamily和extBlock.FontFamily属性是在各自的基类中分别声明,但是他们都是引用同一个依赖项属性,所以后设置的对象起作用。
可以使用TargetType属性解决这种问题
触发器
触发器通过Style.Triggs集合链接到样式,每个样式都可以有多个触发器。触发器重要的属性
Trigger:这是一种简单触发器,可以监测依赖项属性的变化,然后使用设置器改变样式。
MultiTrigger:与Trigger相似,但这中触发器联合的多种条件,只有当所有这些条件都满足时才发生。
DataTrigger:这种触发器使用数据绑定。与Trigger类似,只不过监视的任意绑定数据的变化.
MultiDataTrigger:联合多个数据触发器。
EventTrigger:这是最发杂的触发器,当事件发生时,这种触发器用于动画。
触发器的优点是不需要为反转他们而编写任何逻辑,只要停止应用触发器,元素就会恢复到正常外观。可创建一次应用于同一元素的多个触发器,如果这些触发器设置不同的属性,这种情况就不会出现混乱,然而,如果多个触发器修改同一属性,那么最后的触发器有效。
<Style.Triggers>
<Trigger Property="Control.IsFocused" Value="True">
<Setter Property="Control.Foreground" Value="DarkRed"/>
</Trigger>
<Trigger Property="Control.IsMouseOver" Value="True">
<Setter Property="Control.Foreground" Value="LightBlue"/>
<Setter Property="Control.FontWeight" Value="Bold"/>
</Trigger>
<Trigger Property="Button.IsPressed" Value="True">
<Setter Property="Control.Foreground" Value="Red"/>
</Trigger>
</Style.Triggers>
当按钮被点击时,前景色是红色,因为红色是最后设置的。
如果希望创建只有当多个条件都为真时才激活的触发器,可以使用MultiTrigger,这种触发器提供了一个Condition是集合,可通过该属性定义一系列属性和值得集合,
<Style x:Key="BigMultiStyle">
<Style.Triggers>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="Button.IsPressed" Value="True"></Condition>
<Condition Property="Control.IsMouseOver" Value="True"/>
</MultiTrigger.Conditions>
<MultiTrigger.Setters>
<Setter Property="Control.Foreground" Value="Red"/>
</MultiTrigger.Setters>
</MultiTrigger>
</Style.Triggers>
</Style>