WPF样式和触发器

理解样式

样式可以定义通用的格式化特征集合。


Style 类的属性

Setters、Triggers、Resources、BasedOn、TargetType

<Style x:Key="BitFontButtonStyle" TargetType="Button">
  <setter Property="FontFamily" Value="Times New Roman"/>
</Style>

如果以上代码不使用x:Key ,那个TargetType属性还可以作为自动应用样式的快捷方式。

<!--删除自动应用的样式-->
<Buttn style="{x:Null}"/>  

关联事件处理程序

<Style x:key="MouseOverHighLightStyle">
  <EventSetter  Event="TextBlock.MouseEnter" Handler="element_MouseEnter"/>
</Style>
private void element_MouseEnter(object sender,MouseEventArgs)
{
  //业务代吗   事件处理程序
}

多层样式
*BaseOn *属性来设置样式的继承

<Style x:Key="NewButtonStyle" BaseOn="ButtonBaseStyle"/>

BaseOn可创建完整的样式继承链,最后设置的同一属性会覆盖基样式,样式继承的依赖会使程序变得脆弱,不建议使用样式继承。

触发器

可自动完成简单的样式改变,需要使用样板事件处理逻辑。通过 Style.Triggers集合链接到样式中,继承System.Windows.TriggerBase
TriggerBase的继承类
TriggerMultiTriggerDataTriggerMultiDataTriggerEventTrigger
通过FrameworkElement.Triggers集合可以直接为元素应用触发器。
简单触发器

<Style x:key="TextBoxStyle" >
  <Style.Setters>
    <Setter Property="Control.Background" Value="Red"/>
  </Style.Setters>
  <Style.Triggers>
    <Trigger Property="Control.IsFocus" Value="True" >
      <Setter Property="Control.Backgroud" Value="Yellow"/>
    </Trigger>
    <Trigger Property="Control.IsPressed" Value="True">
      <Setter Property="Control.Background" Value="Blue"/>
    </Trigger>
  </Style.Triggers>
</Style>

以上触犯器都触发了IsFocusedIsPressed属性,那么设置的背景颜色为Blue,这不在于那个属性先触发,而是取决于触发器在标记中的排列顺序。

<Style x:key="TextBoxStyle" >
  <Style.Setters>
    ...
  </Style.Setters>
  <Style.Triggers>
    <MultiTrigger>
      <MultiTrigger.Conditions>
        <Condition Property="Control.IsFocused" Value="True"/>
        <Condition Property="Control.IsMouseOver" Value="True"/>
      </MultiTrigger.Conditions>
      <MultiTrigger.Setters>
        <Setter Property="Control.Background" Value="Pink"/>
      </MultiTrigger.Setters>
    </MultiTrigger>
  </Style.Triggers>
</Style>

多条件的情况项不用关系声明的顺序,在改变背景颜色之前需要条件都为真。

事件触发器

<Style x:Key="BigFontButton">
  <Style.Setters>
    ...
  </Style.Setters>
  <Style.Triggers>
    <EventTrigger RoutedEvent="Mouse.MouseEnter">
      <EventTrigger.Actions>
        <BeginStoryBoard>
          <DoubleAnimation Duration="0:0:0.2" 
            Storyboard.TargetProperty="FontSize"
            To="22"/>
        </BeginStoryBoard>
      </EventTrigger.Actions>
    </EventTrigger>
  </Style.Triggers>
</Style>

DoubleAnimationDouble类型动画类,位于System.Windows.Media.Aniamtion,Storyboard为故事版,为动画提供时间线,内部可以定义一个或多个动画。动画在一定时间类修改依赖项属性。

posted @ 2022-04-23 21:17  蓝白永恒  阅读(108)  评论(0编辑  收藏  举报