一、样式基础
样式可以定义一套组合的属性,
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.事件触发器
普通的触发器等待属性改变时触发,事件触发器等待事件改变时触发