创建样式文件
wpf工程右键添加-资源字典(.xaml文件)即可,当然我建议创建对应的文件夹保存这些样式文件,方便管理。
添加样式文件内容
初始样式文件内容如下(没有任何样式定义):
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
</ResourceDictionary>
- 如下定义一个简单TextBlock控件样式:
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Style x:Key="FontAwesomeBig" TargetType="TextBlock">
<Setter Property="FontFamily" Value="/LCM;component/Font/#FontAwesome"/>
<Setter Property="Foreground" Value="#676A6C" />
<Setter Property="TextAlignment" Value="Center"/>
<Setter Property="HorizontalAlignment" Value="Center"/>
<Setter Property="VerticalAlignment" Value="Center"/>
<Setter Property="RenderTransformOrigin" Value="0.5,0.5"/>
<Setter Property="FontSize" Value="17"/>
</Style>
</ResourceDictionary>
- 如下定义一个简单DataGrid和DataGridRow控件样式:
<Style TargetType="DataGrid" x:Key="DataGridCustomizedStyle">
<!--允许调整列宽-->
<Setter Property="CanUserResizeColumns" Value="True"/>
<!--禁止拖动列内容-->
<Setter Property="CanUserReorderColumns" Value="false"/>
<!--禁止添加行,消除最后一行的多余显示-->
<Setter Property="CanUserAddRows" Value="false"/>
<!--禁止排序-->
<Setter Property="CanUserSortColumns" Value="false"/>
<!--虚拟化行 减少通讯开销-->
<Setter Property="EnableRowVirtualization" Value="False"/>
<!--首列冻结-->
<Setter Property="FrozenColumnCount" Value="0"/>
<!--显示网格线-->
<Setter Property="GridLinesVisibility" Value="None"/>
<!--屏蔽最左侧的行标题-->
<Setter Property="HeadersVisibility" Value="Column"/>
<!--字体颜色-->
<Setter Property="Foreground" Value="White" />
<!--背景颜色-->
<Setter Property="Background" Value="Transparent"/>
<Setter Property="BorderThickness" Value="0"/>
<!--网格线颜色-->
<Setter Property="HorizontalGridLinesBrush" Value="#11C2EE"/>
<Setter Property="VerticalGridLinesBrush" Value="#11C2EE"/>
</Style>
<Style TargetType="DataGridRow" x:Key="DataGridRowCustomizedStyle">
<Setter Property="Foreground" Value="White"/>
<Setter Property="Background" Value="#11C2EE"/>
<Style.Triggers>
<!--选中一行 改变字体颜色和背景-->
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsSelected" Value="True"/>
</MultiTrigger.Conditions>
<Setter Property="Background" Value="#11C2EE"/>
<Setter Property="Foreground" Value="White"/>
</MultiTrigger>
<!--鼠标滑过 只改变背景 不改变字体颜色-->
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsMouseOver" Value="True"/>
<Condition Property="IsSelected" Value="False"/>
</MultiTrigger.Conditions>
<Setter Property="Background" Value="#11C2EE"/>
</MultiTrigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsMouseOver" Value="False"/>
<Condition Property="IsSelected" Value="true"/>
</MultiTrigger.Conditions>
<Setter Property="Background" Value="#11C2EE"/>
</MultiTrigger>
</Style.Triggers>
</Style>
关于样式的引用可以查看我前面的文章!
样式属性内容解析
- TextBlock样式中属性内容:
Style:定义一个样式模板
x:Key:改样式模板定义一个别名
TargetType:指定样式应用控件类别即什么控件使用
Setter:设置定义控件属性参数
Property:属性
Value:属性的参数值
重点讲解:
FontFamily属性的内容此处是设置文字(类似时使用微软雅黑还是楷体宋体等等)。
如果key值不定义默认只要引用了资源字典中定义的控件都使用该样式。定义了key值则在控件style="{staticresource xxx}"中应用指定定义的样式。
- DataGrid和DataGridRow样式属性内容:
Triggers:
触发器,当属性发生变化时,可以进行响应,并自动调整样式。每个样式可以有任意多个触发器,而且每个触发器都是System.Windows.TriggerBase的派生类的实例。
继承自TriggerBase的类还有:
- MultiTrigger:与Trigger类似,但这种触发器联合了多个条件,只有满足了所有这些条件,才会启动出触发器
- DataTrigger:数据绑定触发器
- MultiDataTrigger:联合多个数据触发器
- EventTrigger:这是复杂的触发器,当事件发生时,这种触发器应用动画
普通触发器是等待属性发生变化,而事件触发器是等待特定的事件被引发。事件触发器要求用户提供一系列修改控件的动作,这些动作通常被应用为动画。 如下图所示:
<Window.Resources>
<Style x:Key="SetButtonMouseOver">
<!--设置触发器-->
<Style.Triggers>
<!--设置触发器的路由事件-->
<EventTrigger RoutedEvent="Control.MouseEnter">
<!--设置一个动画,改变元素的字体的大小-->
<EventTrigger.Actions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Duration="0:0:0:2" Storyboard.TargetProperty="FontSize" To="30"></DoubleAnimation>
</Storyboard>
</BeginStoryboard>
</EventTrigger.Actions>
</EventTrigger>
</Style.Triggers>
</Style>
</Window.Resources>
<StackPanel>
<!--设置样式-->
<Button Style="{StaticResource SetButtonMouseOver}">Hello,World!!!</Button>
</StackPanel>
多级触发器如果希望创建只有当几个条件都为真时才激活的触发器,可使用MultiTrigger,这种触发器提供了一个Conditions(条件)集合,可通过该集合定义一系列属性值的集合。如下图所示:
<Window.Resources>
<Style x:Key="SetButton">
<!--触发器-->
<Style.Triggers>
<!--使用多条件触发器-->
<MultiTrigger>
<!--通过Conditions属性设置多个条件(一个是获取焦点和鼠标移动到元素上。)。-->
<MultiTrigger.Conditions>
<Condition Property="Control.IsFocused" Value="true"></Condition>
<Condition Property="Control.IsMouseOver" Value="true"></Condition>
</MultiTrigger.Conditions>
<!--设置多个属性值-->
<MultiTrigger.Setters>
<Setter Property="Control.FontSize" Value="30"></Setter>
</MultiTrigger.Setters>
</MultiTrigger>
</Style.Triggers>
</Style>
</Window.Resources>
<StackPanel>
<!--设置样式。-->
<Button Style="{StaticResource SetButton}">Hello,World!!!</Button>
</StackPanel>