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>

我的公众号

posted @ 2021-11-29 19:30  RisingWaves  阅读(62)  评论(0)    收藏  举报