在WPF中,Sytle是一个非常重要的东西,它是一种对属性值的处理,其中Trigger(触发器)则是在属性值的处理中加上条件。
WPF定义了五种Trigger来作为触发条件,分别是:Trigger,DataTrigger,MultiTrigger,MultiDataTrigger,EventTrigger。
下面最简单的一个Trigger是这样写的:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
<Style TargetType="Button" x:Key="buttonStyle"> <Style.Triggers> <Trigger Property="IsMouseOver" Value="True"> <Setter Property="Width" Value="100" /> <Setter Property="Height" Value="50" /> </Trigger> </Style.Triggers> </Style>
在条件设置中,只要鼠标移动到Button上面时,就可以引动到触发器,然后设置它的长宽,当鼠标移开时候,触发器就会失效,然后就会变到原来的值。这个触发器以控件的属性作为触发条件。
还有时会用到DataTrigger,这个一般以控件DataContext的属性作为触发条件。当某个数据值是想要的值时,就可以设置相应的样式。
有时候也可以先设置一个依赖属性,然后根据不同的条件来设置不同的属性值,再通过DataTrigger来设置也是可以的,下面有一个例子来运用一下DataTrigger:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
<TextBox x:Name="textBox" Width="100" Height="50" Margin="10" Background="{Binding RelativeSource={RelativeSource self},Path=Text, UpdateSourceTrigger=PropertyChanged}" TextChanged="TextBox_TextChanged_1"> <TextBox.Resources> <Style TargetType="TextBox"> <Style.Triggers> <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self},Path=LabelBackground}" Value="red"> <Setter Property="Background" Value="Red" /> </DataTrigger> </Style.Triggers> </Style> </TextBox.Resources> </TextBox>
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
private void TextBox_TextChanged_1(object sender, TextChangedEventArgs e) { if (textBox.Text.ToLower() == "red") { LabelBackground = "red"; } } public string LabelBackground { get { return (string)GetValue(LabelBackgroundProperty); } set { SetValue(LabelBackgroundProperty, value); } } public static readonly DependencyProperty LabelBackgroundProperty = DependencyProperty.Register("LabelBackground", typeof(string), typeof(MainWindow), new PropertyMetadata(null));
好吧~其实上面也只是硬要用一下而已~纯属娱乐。。。当然在很多时候用这个也是很方便的!
MultiTrigger,MultiDataTrigger这两个和上面差不多,只是多属性触发罢了。
EventTrigger是以RoutedEvent作为触发条件,当指定的路由事件Raise时触发。这个暂时还没怎么玩过,等下次用到再说=-=