WPF中的Style
来源:互联网 发布:d3.js path 路径文字 编辑:程序博客网 时间:2024/05/29 17:02
构成Style最重要的两种元素是Setter和Trigger,Setter类帮助我们设置控件的静态外观风格,Trigger类帮助我们设置控件的行为风格。
Style中的Setter
Setter——设置器,我们给属性赋值的时候一般都采用“属性名 = 属性值”的形式。Setter类的Property属性用来指明你想为目标的哪个属性赋值;Setter类的Value属性则是我们所要指定的属性值。
下面的例子是在Window的资源词典中防止一个针对于TextBlock的Style,Style中使用若干Setter来设定TextBlock的一些属性,这样程序中的TextBlock就会具有统一的风格,除非使用{x:Null}显示地清空Style。
<Window x:Class="Chapter11.Page236.Demo.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="350" Width="525"> <Window.Resources> <Style TargetType="TextBlock"> <Setter Property="FontSize" Value="24"/> <Setter Property="TextDecorations" Value="Underline"/> <Setter Property="FontStyle" Value="Italic"/> </Style> </Window.Resources> <StackPanel> <TextBlock Text="Hello WPF"/> <TextBlock Text="This is a sample of Style"/> <TextBlock Text="by HA" Style="{x:Null}"/> </StackPanel></Window>
根据上面的例子我们可以推知,如果想设置控件的ControlTemplate,只需要把Setter的Property设置为Template并为Value提供一个ControlTemplate对象即可。
Style中的Trigger
Trigger——触发器,即当某些条件满足时会触发一个行为(比如某些值的变化或动画的发生等)。触发器比较像事件。事件一般是由用户触发的,而触发器除了有事件触发型的EventTrigger外,还有数据变化触发型的Trigger / DataTrigger及多条件触发型的 MultiTrigger / MultiDataTrigger等。
1. 基本Trigger
Trigger类最基本的触发器。类似于Setter,Trigger也有Property和Value这两个属性,Property是Trigger关注的属性名称,Value是触发条件。Trigger类还有一个Setter属性,此属性值是一组Setter,一旦触发条件被满足,这组Setter的“属性 —— 值”就会被应用,触发条件不再满足后,各属性值会被还原。
下面的例子中包含一个针对CheckBox的Style,当CheckBox的IsChecked属性为True时,前景色和字体会改变。
<Window x:Class="Chapter11.Page238.Demo.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="350" Width="525"> <Window.Resources> <Style TargetType="CheckBox"> <Style.Triggers> <Trigger Property="IsChecked" Value="True"> <Setter Property="FontSize" Value="20"/> <Setter Property="Foreground" Value="Orange"/> </Trigger> </Style.Triggers> </Style> </Window.Resources> <StackPanel> <CheckBox Content="CheckBox1" Margin="5"/> <CheckBox Content="CheckBox2" Margin="5"/> <CheckBox Content="CheckBox3" Margin="5"/> </StackPanel></Window>
因为Triggers不是Style的内容属性,所以<Style.Triggers>...</Style.Triggers>这层标签不能省略,但Trigger的Setter属性是Trigger的内容属性,所以可以省略。
.
2. MultiTrigger
MultiTrigger是个容易让人误解的名字,会让人以为是多个Trigger集成在一起,实际上角MultiConditionTrigger更合适,因为必须多个条件同时成立时才会被触发。MultiTrigger比Trigger多了一个Conditions属性,需要同时成立的条件就存储在这个集合中。
要求同时满足CheckBox被选中且Content为“CheckBox1”时,才会被触发:
<Window x:Class="WpfApplication33.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="350" Width="525"> <Window.Resources> <Style TargetType="CheckBox"> <Style.Triggers> <MultiTrigger> <MultiTrigger.Conditions> <Condition Property="IsChecked" Value="True"/> <Condition Property="Content" Value="CheckBox1"/> </MultiTrigger.Conditions> <MultiTrigger.Setters> <Setter Property="FontSize" Value="20"/> <Setter Property="Foreground" Value="Orange"/> </MultiTrigger.Setters> </MultiTrigger> </Style.Triggers> </Style> </Window.Resources> <StackPanel> <CheckBox Content="CheckBox1" Margin="5"/> <CheckBox Content="CheckBox2" Margin="5"/> <CheckBox Content="CheckBox3" Margin="5"/> </StackPanel></Window>
3. 由数据触发的DataTrigger
程序中经常会遇到基于数据执行某些判断情况,遇到这种情况时我们可以考虑使用DataTrigger。DataTrigger对象的Binding属性会把数据源源不断送过来,一旦送来的值与Value属性一致,DataTrigger即被触发。
下面的例子,当TextBox的Text长度小于7个字符时,其Border会保持红色:
<Window x:Class="WpfApplication35.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:WpfApplication35" Title="MainWindow" Height="350" Width="525"> <Window.Resources> <local:L2BConverter x:Key="cvtr"/> <Style TargetType="TextBox"> <Style.Triggers> <DataTrigger Binding="{Binding RelativeSource={x:Static RelativeSource.Self},Path=Text.Length,Converter={StaticResource cvtr}}" Value="False"> <Setter Property="BorderBrush" Value="Red"/> <Setter Property="BorderThickness" Value="1"/> </DataTrigger> </Style.Triggers> </Style> </Window.Resources> <StackPanel> <TextBox Margin="5"/> <TextBox Margin="5"/> <TextBox Margin="5"/> </StackPanel></Window>需要解释的就是DataTrigger的Binding:为了将控件自己作为数据源,我们使用了RelativeSource,初学者经常认为“不明确指定Source的值Binding就会将控件自己作为数据的来源”,这是错误的,因为不明确指出Source时Binding会把控件的DataContext属性当做数据源而非把控件自身作为数据源。Binding的Path被设置了Text.Length,即我们关注的是字符串的长度。长度是一个具体的数字,我们需要返回的是一个bool类型的数据,所以需要创建一个Converter:
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Windows.Data;namespace WpfApplication35{ public class L2BConverter:IValueConverter { public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { int textLength = (int)value; return textLength > 6 ? true : false; } public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { throw new NotImplementedException(); } }}
- WPF中的Style
- WPF中的Style
- WPF中的Style
- WPF中的Style(风格,样式)
- WPF中的Style(风格,样式)
- WPF中的Style(风格,样式)
- WPF中的Style(风格,样式)
- WPF 中的样式(Style)
- WPF模板-Style中的Setter
- WPF中的Style——出自《IT168》
- WPF中的模板(五)- 使用Style
- wpf Style
- WPF中的Style多文件解决方案(XAML篇)
- WPF Window's style
- wpf-Style注意点
- wpf button ,datagrid style
- WPF ListBox Style
- [WPF]Watermask TextBox Style
- js + jquery 方法功能总结
- Lua 标准库 - 基本函数(base function)
- LEADTOOLS Media Foundation SDK使用方法
- 对要学习编程人员的忠告
- JavaBean之间拷贝利器-Dozer 映射数据类型不一致,级联映射与自定义映射
- WPF中的Style
- Android设备功能之传感器教程篇
- 6-HEVC参考代码HM10.0的使用
- tcp udp http
- ubuntu 下安装tomcat
- 黑马程序员---abstract
- 定时器schedule
- Android应用程序组件之Activity
- mysql数据库相关