Silverlight(WPF)知识随手记[4]:浅谈Style中的Setter与Trigger

  如果把WPF窗体看作一个舞台,那么窗体上的控件就是一个个演员,它们的职责就是在用户界面上按照业务逻辑的需要扮演自己的角色,为了让同一种控件能担当不同的角色,程序员就要为它们设计多种外观样式和行为动作,这就是Style。构成Style最重要的两种元素是Setter与Trigger,它们相应是设置控件的静态外观风格与设置控件的行为风格。

一、浅谈Style中的Setter

  Setter类的Property属性用来指明准备为目标的哪个属性赋值;而Setter类的Value属性则是你提供的属性值。
<Window.Resources>
<Style TargetType="TextBlock">
<Style.Setters>
<Setter Property="FontSize" Value="22"/>
<Setter Property="TextDecorations" Value="Underline"/>
<Setter Property="FontStyle" Value="Oblique"/>
</Style.Setters>
</Style>
</Window.Resources>
<StackPanel>
<TextBlock Text="Hello cnblogs"/>
<TextBlock Text="Without style" Style="{x:Null}"/>
</StackPanel>
  
    
  因为Style的内容属性是Setters,所以我们可以直接在<Style>标签的内容区域写setter,即可省略<Style.Setters>标签。

  从上面代码我们可以看出,如果想设置控件的ControlTemplate,只需要把Setter的Property设为Template并为Value提供一个ControlTemplate对象即可。

二、浅谈Style中的Trigger

  Trigger,触发器,即当某些条件满足时会触发一个行为,它比较像事件。事件一般是由用户操作触发的,而触发器除了有事件触发型的EventTrigger外还有数据变化触发型的Trigger/DataTrigger及多条件触发型的MultiTrigger/MultiDataTrigger等。
  1.基本Trigger

Trigger类是最基本的触发器,也有Property和Value这两个属性,Property是Trigger关注的属性名称,Value是触发条件。Trigger类还有一个Setters属性,此属性值是一组Setter,一旦触发条件被满足,这组Setter的"属性-值"就会被应用,触发条件不再满足时,各属性值会被还原。


  2.MultiTrigger

MultiTrigger是一个容易让人误解的名字,会让人以为是多个Trigger集成在一起,实际上叫MultiConditionTrigger更合适,因为必须多个条件同时成立时才能被触发。MultiTrigger比Trigger多了一个Conditions属性,需要同时成立的条件就存储在这个集合中。


  3.由数据触发的DataTrigger

DataTrigger对象的Binding属性会把数据源源不断送过来,一旦送来的值与Value属性一致,DataTrigger即被触发。如下面的代码,当TextBox的Text长度小于8个字符时其Border会保持红色。

01 <Window x:Class= "WPFTEST.Window1"
02     xmlns= "http://schemas.microsoft.com/winfx/2006/xaml/presentation"
03     xmlns:x= "http://schemas.microsoft.com/winfx/2006/xaml"
04         xmlns:local= "clr-namespace:WPFTEST"
05     Title= "WPFTEST" Height= "130" Width= "300"
06     >
07     <Window.Resources>
08     <local:L2BConverter x:Key= "cvtr" />
09     <Style TargetType= "TextBox" >
10         <Style.Triggers>
11         <DataTrigger Binding= "{Binding RelativeSource={x:Static RelativeSource.Self},
12                      Path=Text.Length,Converter={StaticResource cvtr}}" Value= "false" >
13             <Setter Property= "BorderBrush" Value= "Red" />
14             <Setter Property= "BorderThickness" Value= "1" />
15             </DataTrigger>
16         </Style.Triggers>
17         </Style>
18     </Window.Resources>
19     <StackPanel>
20     <TextBox Margin= "5" />
21     <TextBox Margin= "5,0" />
22     <TextBox Margin= "5" />
23     </StackPanel>
24 </Window>

这里需要解释的就是DataTrigger的Binding,为了将控件自己作为数据源,我们使用了RelativeSource,在不明确指出Source时Binding会把控件的DatContext属性当作数据源而非把控件自身当作数据源,这里我们使用了一个自定义的Converter,把长度转换成真假判断,代码如下

01 /****************************************
02 * 日期: 2011/4/20
03 * 时间: 0:06
04 ****************************************/
05 using System;
06
07 namespace WPFTEST
08 {
09     /// <summary>
10     /// Description of L2BConverter.
11     /// </summary>
12     public class L2BConverter : System . Windows . Data . IValueConverter
13     {
14         public object Convert( object value , Type targetType , object parameter , System . Globalization . CultureInfo culture)
15         {
16             int textLength =( int) value;
17             return textLength > 7 ? true : false;
18         }
19         public object ConvertBack( object value , Type targetType , object parameter , System . Globalization . CultureInfo culture)
20         {
21             throw new NotImplementedException();
22         }
23     }
24 }
  4.多数据条件触发的MultiDataTrigger

和DataTrigger相似,只是要求多个数据条件同时满足时才能触发变化,例如在下面的场景里:用户界面上使用ListBox显示了一列Student数据,当Student对象同时满足ID为3,Name为Tomcat时时候,条目就高亮显示。


  5.由事件触发的EventTrigger

EventTrigger是触发器中最特殊的一个,首先,它不是由属性值或数据的变化来触发而是由事件来触发;其次,被触发后它并非应用一组Setter,而是执行一段动画,因此,UI层的动画效果往往与EventTrigger相关联。


  5.小总结

虽然在Style中大量使用触发器,但触发器并非只能应用在Style中,各种Template也可以拥有自己的触发器,大家可以决定触发器放在Style中还是Template中。

三、参考资源

转载于:https://www.cnblogs.com/wpdev/archive/2011/04/05/2005528.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值