WPF编程宝典--样式与行为·上
写在前面
这篇文章主要是讲样式与行为中的样式(Style),上篇文章我们讲到了资源,和今天的样式呼应还是挺多的,因为大多数情况下,样式也作为一种资源来使用,废话不多说直接进入主题把。
样式基础
如果说资源是单个的属性值,那么样式就是多个属性值的集合,上代码
<Window.Resources>
//资源
<FontFamily x:Key="FontFamily1">Time New Roman</FontFamily>
<FontWeight x:Key="FontWeight1">Bold</FontWeight>
//样式
<Style x:Key="ButtonStyle1">
<Setter Property="Control.FontFamily" Value="Time New Roman"/>
<Setter Property="Control.FontWeight" Value="Bold"/>
</Style>
</Window.Resources>
样式不仅能设置属性,还能处理事件
<Style x:Key="ButtonStyle1">
<EventSetter Event="Button.MouseEnter" Handler="element_MouseEnter"/>
</Style>
private void element_MouseEnter(object sender, MouseEventArgs e)
{
//dosomething();
}
通过类型自动应用样式
在实际的项目中我们可能希望某一界面上所有的按钮都是同一种样式的,如果按照上面的方法,我们需要定义一个样式,然后为每个按钮加载这种样式,这样做就会很麻烦,设计师为我们提供了更加简单快捷的方法,就是使用TargetType属性,
<Window.Resources>
<Style TargetType="Button">
<Setter Property="Control.FontFamily" Value="Time New Roman"/>
<Setter Property="Control.FontSize" Value="18"/>
<Setter Property="Control.FontWeight" Value="Bold"/>
</Style>
</Window.Resources>
这样当前界面里有这样一个样式,界面中所有的按钮都会默认成此样式,但是在特殊的情况下,我们可能会希望其中某一个按钮的样式与其他的不同,
//使用默认样式
<Button Height="30" Width="100" Content="button" />
//不使用样式
<Button Height="30" Width="100" Content="button" Style="{x:Null}" />
触发器
样式中能添加触发器功能,可以为按钮等控件提供鼠标事件,当然触发器也分很多种,今天我们讲的主要是三种,Trigger(简单的触发器),MultiTrigger(联合触发器),EventTrigger(事件触发器),首先用最简单的触发器给大家写个例子,
<Style x:Key="ButtonStyle1">
<Style.Triggers>
<Trigger Property="Control.IsFocused" Value="True">
<Setter Property="Control.Foreground" Value="Red"/>
</Trigger>
</Style.Triggers>
</Style>
就这样最简单的触发器就完成了,只要按钮应用了这个样式,这个触发器就能在按钮上生效了。而且使用触发器的好处就是,不用写反向逻辑,只要触发器的条件没有达到,按钮就会回到原来的状态。
联合触发器其实和简单触发器一样,只不过触发条件从一个变成了几个。
<Style x:Key="ButtonStyle1">
<Style.Triggers>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="Control.IsFocused" Value="True" />
<Condition Property="Control.IsMouseOver" Value="True" />
</MultiTrigger.Conditions>
<MultiTrigger.Setters>
<Setter Property="Control.Foreground" Value="Red" />
</MultiTrigger.Setters>
</MultiTrigger>
</Style.Triggers>
</Style>
最后我们要讲的是事件触发器,普通触发器属性发生变化就会触发,事件触发器则是触发了某些事件才会触发,更多是运用在动画当中,所以这里我们就举个例子,不深入讲解了。
<Style x:Key="ButtonStyle1">
<Style.Triggers>
<EventTrigger RoutedEvent="Mouse.MouseEnter">
<EventTrigger.Actions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation
Duration="0:0:0.2"
Storyboard.TargetProperty="FontSize"
To="22"/>
</Storyboard>
</BeginStoryboard>
</EventTrigger.Actions>
</EventTrigger>
<EventTrigger RoutedEvent="Mouse.MouseLeave">
<EventTrigger.Actions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation
Duration="0:0:0.2"
Storyboard.TargetProperty="FontSize"/>
</Storyboard>
</BeginStoryboard>
</EventTrigger.Actions>
</EventTrigger>
</Style.Triggers>
</Style>
写在结尾
今天我们学习了样式,有很多同学会问,感觉样式和资源的作用差不多嘛,特别是在不使用触发器的情况下,结尾我就和大家聊聊我对资源和样式的理解,在我看来资源,他没有针对性,单纯的就是一个值,就像逻辑代码里面的一个变量,只要是类型一样的,哪里都能用到它,但是样式不同,它的针对性更强,他就是为某一类控件提供一个默认模板的,当然他们也是一种包含关系,样式可以作为一种资源使用。我在实际项目种,很少在某个页面上使用资源,大多数情况是外部项目作为资源加载到当前应用程序。