Trigger和DataTrigger简单应用

  在WPF中,Sytle是一个非常重要的东西,它是一种对属性值的处理,其中Trigger(触发器)则是在属性值的处理中加上条件。

  WPF定义了五种Trigger来作为触发条件,分别是:Trigger,DataTrigger,MultiTrigger,MultiDataTrigger,EventTrigger。

  下面最简单的一个Trigger是这样写的:  

View Code
<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:

View Code
 <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>
View Code
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时触发。这个暂时还没怎么玩过,等下次用到再说=-=

原文地址:https://www.cnblogs.com/socialdk/p/2865641.html