WPF_11_样式和行为
WPF 提供了几个特性,允许为基本元素插入一些自己喜欢的东西,并标准化程序的可视化外观。
- 样式(style)-组织和重用格式化选项的重要工具。
- 行为(behavior)-封装一些通用的UI功能。
样式
<Window.Resources>
<!--与资源一样,样式都有一个键名,通常以 Style 结尾-->
<Style x:Key="BigFontButtonStyle">
<Setter Property="Control.FontFamily" Value="Times New Roman"/>
<Setter Property="Control.FontSize" Value="18"/>
<Setter Property="Control.FontWeight" Value="Bold"/>
</Style>
</Window.Resources>
样式通过元素的 Style 属性(FrameworkElement基类中定义)插入到元素中。
<Button Name="cmd" Style="{StaticResource BigFontButtonStyle}"/>
样式设置元素的初始外观,如果设置了相应的属性会覆盖样式。理想情况下不应该依赖这种行为-应当创建更多样式,以便调整界面时有更大的灵活性。
Style类中共有5个重要属性:
| 属性 | 说明 |
|---|---|
| Setters | 设置属性值以及自动关联事件处理程序的 Setter 对象或 EventSetter 对象的集合 |
| Triggers | 继承自 TriggerBase 类并能自动改变样式设置的对象集合 |
| Resources | 用于样式的资源集合 |
| BasedOn | 创建继承自其他样式设置的更具体样式 |
| TargetType | 标识应用样式的元素的类型 |
如果希望为一组控件使用相同的字体,又不想为每个控件使用相同的样式。这种情况可将它们放在容器中并设置容器的样式,只要设置的属性具有属性值继承特性,这些值就会传递到子元素。
如果决定使用自动样式设置外观,就不要使用属性继承,避免变的更复杂。此时可尝试为特例使用明确的样式。
属性设置器是所有样式中最常见的要素,但也可以创建为事件关联特定处理程序的 EventSetter 对象的集合。
<Style x:Key="MouseOverHighlightStyle">
<EventSetter Event="TextBlock.MouseEnter" Handler="element_MouseEnter"/>
<EventSetter Event="TextBlock.MouseLeave" Handler="element_MouseLeave"/>
<Setter Property="TextBlock.Padding" Value="5"/>
</Style>
触发器
使用触发器可自动完成简单的样式改变,而这通常需要使用样板事件处理逻辑。触发器通过 Style.Triggers 集合链接到样式,每个触发器都是 System.Windows.TriggerBase 的派生类的实例。
| 实现类 | 说明 |
|---|---|
| Trigger | 检测属性的变化 |
| MultiTrigger | 多条件触发 |
| DataTrigger | 监视绑定数据的变化 |
| MultiDataTrigger | 多个数据触发器 |
| EventTrigger | 当事件发生时,触发器应用动画 |
通过使用 FrameworkElement.Triggers 集合可直接为元素应用触发器,而不需要创建样式,但只支持事件触发器。
<Style x:Key="BigFontButton">
<Style.Triggers>
<Triggers Property="Control.IsFocused" Value="True">
<Setter Property="Control.Foreground" Value="DarkRed"/>
</Triggers>
</Style.Triggers>
</Style>
本质上,触发器是众多覆盖从依赖属性返回的值的属性提供者之一。但原始的属性仍会保留。只要触发器被禁用,触发器之前的属性值就会再次可用。
行为
行为创建封装了一些通用用户界面功能的行为,可以添加到任意程序的另一个控件中。
- System.Widnows.Interactivity.dll - 定义了支持行为的基本类。
- Microsoft.Expression.Interactions.dll - 通过添加可选的以核心行为类为基础的动作和触发器类,增加了一些有用的扩展。
public class DragInCanvasBehavior : Behavior<UIElement>
{
protected override void OnAttached()
{
base.OnAttached();
// 通过 AssociatedObject 属性访问放置行为的元素,并可以关联事件处理程序
this.AssociatedObject.MouseMove += M_MouseMove;
this.AssociatedObject.MouseLeftButtonUp += M_MouseLeftButtonUp;
}
protected override void OnDetaching()
{
base.OnDetaching();
this.AssociatedObject.MouseMove -= M_MouseMove;
this.AssociatedObject.MouseLeftButtonUp -= M_MouseLeftButtonUp;
}
}
<Canvas>
<Ellipse Canvas.Left="10" Canvas.Top="70">
<i:Interaction.Behaviors>
<custom:DragInCanvasBehavior/>
</i:Interaction.Behaviors>
</Ellipse>
</Canvas>
我的公众号


WPF 提供了几个特性,允许为基本元素插入一些自己喜欢的东西,并标准化程序的可视化外观。
浙公网安备 33010602011771号