(21)WPF 样式和行为

  一、样式基础

样式可以定义一套组合的属性,

1.xaml方式

    <Window.Resources>
        <Style x:Key="btnStyle">
            <Setter Property="FrameworkElement.Width" Value="200"></Setter>
            <Setter Property="FrameworkElement.Height" Value="50"></Setter>
        </Style>
    </Window.Resources>

    <StackPanel FocusManager.IsFocusScope="True">
        <Button  x:Name="btn1" Style="{StaticResource btnStyle}" >new2</Button>
        <Button  x:Name="btn2" Width="200" Height="50" >new2</Button>
    </StackPanel>

2.代码方式

使用样式

btn1.Style = (Style)this.FindResource("btnStyle");

3.Style类属性

Seters:

Triggers:触发器

Resources:

BasedOn:

TargetType:样式自动关联某元素

4.自动应用样式

当前窗体下的Button按钮都使用此样式

    <Window.Resources>
        <Style TargetType="Button">
            <Setter Property="FrameworkElement.Width" Value="210"></Setter>
            <Setter Property="FrameworkElement.Height" Value="50"></Setter>
        </Style>
    </Window.Resources>

二、触发器

每种触发器都是TriggerBase类的派生类

Trigger:最简单的触发器,监测依赖属性的变化。

MultiTrigger:同时满足多个条件时触发。

DataTrigger:监测任意绑定数据的变化。

MultiDataTrigger:多个数据触发器。

EventTrigger:最复杂的触发器,当事件发生时,触发器应用动画。

1.简单的触发器

https://docs.microsoft.com/zh-cn/dotnet/api/system.windows.controls.control?view=netframework-4.8   Control类

当按下tab焦点到btn1时width会变短,btn1按钮失去焦点时又重新变成200

    <Window.Resources>
        <Style x:Key="btnSyle">
            <Style.Setters>
                <Setter Property="FrameworkElement.Width" Value="200"></Setter>
                <Setter Property="FrameworkElement.Height" Value="50"></Setter>
            </Style.Setters>
            <Style.Triggers>
                <Trigger Property="Control.IsFocused" Value="True" >
                    <Setter Property="FrameworkElement.Width" Value="80" />
                </Trigger>
            </Style.Triggers>
        </Style>       
    </Window.Resources>

    <StackPanel FocusManager.IsFocusScope="True">
        <Button  x:Name="btn1" Style="{StaticResource btnSyle}" >new2</Button>
        <Button  x:Name="btn2"  >new2</Button>
    </StackPanel>

2.多种触发方式

    <Window.Resources>
        <Style x:Key="btnSyle">
            <Style.Setters>
                <Setter Property="FrameworkElement.Width" Value="200"></Setter>
                <Setter Property="FrameworkElement.Height" Value="50"></Setter>
            </Style.Setters>
            <Style.Triggers>
                <Trigger Property="Control.IsFocused" Value="True" >
                    <Setter Property="FrameworkElement.Width" Value="80" />
                </Trigger>
            </Style.Triggers>
        </Style>       
    </Window.Resources>

    <StackPanel FocusManager.IsFocusScope="True">
        <Button  x:Name="btn1" Style="{StaticResource btnSyle}" >new2</Button>
        <Button  x:Name="btn2"  >new2</Button>
    </StackPanel>

3.同时满足多个条件的触发

同时满足鼠标悬停在控件并且焦点也在控件时触发

    <Window.Resources>
        <Style x:Key="btnSyle">
            <Style.Setters>
                <Setter Property="FrameworkElement.Width" Value="200"></Setter>
                <Setter Property="FrameworkElement.Height" Value="50"></Setter>
            </Style.Setters>
            <Style.Triggers>
                <MultiTrigger>
                    <MultiTrigger.Conditions>
                        <Condition Property="Control.IsFocused" Value="True"></Condition>
                        <Condition Property="Control.IsMouseOver" Value="True"></Condition>
                    </MultiTrigger.Conditions>
                    <MultiTrigger.Setters>
                        <Setter Property="FrameworkElement.Width" Value="80" />
                    </MultiTrigger.Setters>
                </MultiTrigger>
            </Style.Triggers>
        </Style>
    </Window.Resources>

4.事件触发器

普通的触发器等待属性改变时触发,事件触发器等待事件改变时触发

三、行为

原文地址:https://www.cnblogs.com/buchizaodian/p/12186815.html