Silverlight(WPF)知识随手记[4]:浅谈Style中的Setter与Trigger
2011-04-05 01:37
405 查看
如果把WPF窗体看作一个舞台,那么窗体上的控件就是一个个演员,它们的职责就是在用户界面上按照业务逻辑的需要扮演自己的角色,为了让同一种控件能担当不同的角色,程序员就要为它们设计多种外观样式和行为动作,这就是Style。构成Style最重要的两种元素是Setter与Trigger,它们相应是设置控件的静态外观风格与设置控件的行为风格。
因为Style的内容属性是Setters,所以我们可以直接在<Style>标签的内容区域写setter,即可省略<Style.Setters>标签。
从上面代码我们可以看出,如果想设置控件的ControlTemplate,只需要把Setter的Property设为Template并为Value提供一个ControlTemplate对象即可。
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中。
一、浅谈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中。
三、参考资源
相关文章推荐
- Silverlight(WPF)知识随手记[3]:对资源的初步认识
- 稳扎稳打Silverlight(64) - 5.0绑定之 Style 中的 Setter 支持绑定, 绑定父级链上的元素, 隐式指定数据模板, UI 上数据更新的触发方式
- Silverlight知识随手记[2]:Silverlight使用LINQ、WCF访问MSSQL数据库
- 【WPF】Silverlight中的Action与Trigger
- WPF模板-Style中的Setter
- 浅谈Silverlight2.0 beta1(2) 控件属性中的Style与DataTemplate
- WPF and Silverlight 学习笔记(十八):WPF样式(Style)与模板(Template)
- WPF Style Setter use a TemplateBinding?
- 程序员角度:将知识体系从WPF过渡到Silverlight
- Silverlight/WPF中 动态Style 的问题
- Silverlight知识随手记[1]:从MDF文件恢复到Sql Server数据库
- WPF and Silverlight 学习笔记(十八):WPF样式(Style)与模板(Template)
- C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(十五) 精灵控件横空出世!②
- 为WPF和Silverlight的Grid添加边框线(zz)
- Prism研究(for WPF & Silverlight)4.从Hello World开始(实战篇)
- WCF、WPF、Silverlight和区别(转)
- [银客北京开发团队]承接各种Silverlight和WPF外包项目和合作项目
- WPF中的Style(风格,样式)
- VS2010 C# 你得学会并且学得会的Socket编程基础知识(Silverlight Socket编程)
- 如何在 UWP 使用 wpf 的 Trigger