触发器

WPF中的触发器(Triggers)允许开发者根据某些条件(如属性变化、事件发生等)自动执行特定的样式或行为。触发器通常用于样式和模板中,使得UI可以动态地响应用户的操作或数据的变化。

WPF中的触发器主要分为以下几种类型:

1. 属性触发器(Property Trigger)

属性触发器用于在控件的某个属性的值发生变化时触发特定的操作。这种触发器最常用于改变控件的样式。(只能用于依赖属性)

示例:

<Style TargetType="Button">
    <Setter Property="Background" Value="LightGray"/>
    <Style.Triggers>
        <Trigger Property="IsMouseOver" Value="True">
            <Setter Property="Background" Value="Orange"/>
        </Trigger>
    </Style.Triggers>
</Style>

在这个示例中,当鼠标悬停在按钮上时,按钮的背景颜色会变为橙色。

2. 数据触发器(Data Trigger)

数据触发器用于根据绑定的数据的值来触发操作。它通常用于绑定到ViewModel或模型的属性,当这些属性的值符合某个条件时触发。(不是控件上的)

 public class Person : INotifyPropertyChanged
 {
     private bool _sex; // true for male, false for female

     public ObservableCollection<Food> FavouriteFoods { get; set; }

     public Person()
     {
         FavouriteFoods = new ObservableCollection<Food>()
         {
             new Food(){Name="波罗蜜" ,Price = 20},
             new Food(){Name="榴莲" ,Price = 120},

         };
     }
     public bool Sex
     {
         get => _sex;
         set
         {
             if (_sex != value)
             {
                 _sex = value;
                 OnPropertyChanged(nameof(Sex));
             }
         }
     }

     public event PropertyChangedEventHandler PropertyChanged;

     protected virtual void OnPropertyChanged(string propertyName)
     {
         PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
     }
 }

 public class Food
 {
     public string Name { get; set; }
     public int Price { get; set; }
 }

   <Window.DataContext>
       <!-- Assume you set the DataContext to an instance of Person -->
       <local:Person Sex="False"/>
       <!-- or false -->
   </Window.DataContext>

   <Grid>
       <Grid.RowDefinitions>
           <RowDefinition></RowDefinition>
           <RowDefinition></RowDefinition>

       </Grid.RowDefinitions>
       <TextBlock Text="{Binding Sex}"
                  VerticalAlignment="Center" HorizontalAlignment="Center">
           <TextBlock.Style>
               <Style TargetType="TextBlock">
                   <Style.Triggers>
                       <DataTrigger Binding="{Binding Sex}" Value="True">
                           <Setter Property="Foreground" Value="Blue"/>
                       </DataTrigger>
                       <DataTrigger Binding="{Binding Sex}" Value="False">
                           <Setter Property="Foreground" Value="Pink"/>
                       </DataTrigger>
                   </Style.Triggers>
               </Style>
           </TextBlock.Style>
       </TextBlock>

       <ListBox Grid.Row="1" ItemsSource="{Binding Path= FavouriteFoods}" Name="listBox" >
           <ListBox.ItemContainerStyle>
               <Style TargetType="ListBoxItem">
                   <Style.Triggers>
                       <DataTrigger Binding="{Binding  Path=Price}" Value="120">
                           <Setter Property="Background" Value="Pink"/>
                       </DataTrigger>
                   </Style.Triggers>
               </Style>
           </ListBox.ItemContainerStyle>
           <ListBox.ItemTemplate>
               <DataTemplate>
                   <WrapPanel>
                       <Label Content="{Binding  Path= Name }"/>
                       <Label Content="{Binding Path= Price }"/>
                   </WrapPanel>

               </DataTemplate>

           </ListBox.ItemTemplate>


       </ListBox>
   </Grid>

3. 事件触发器(Event Trigger)

事件触发器用于在某个事件发生时触发一系列的动画或行为。它最常用于实现动画效果。

<Button Content="Click Me">
    <Button.Triggers>
        <EventTrigger RoutedEvent="Button.Click">
            <BeginStoryboard>
                <Storyboard>
                    <ColorAnimation 
                        Storyboard.TargetProperty="(Button.Background).(SolidColorBrush.Color)" 
                        To="Yellow" Duration="0:0:0.5"/>
                </Storyboard>
            </BeginStoryboard>
        </EventTrigger>
    </Button.Triggers>
</Button>

在这个示例中,当按钮被点击时,按钮的背景颜色会在0.5秒内逐渐变为黄色。

4. 多触发器(MultiTrigger)

多触发器允许你根据多个属性的组合值来触发操作。它们非常适合用在需要同时满足多个条件的场景中。

示例:

<Style TargetType="Button">
    <Style.Triggers>
        <MultiTrigger>
            <MultiTrigger.Conditions>
                <Condition Property="IsMouseOver" Value="True"/>
                <Condition Property="IsPressed" Value="True"/>
            </MultiTrigger.Conditions>
            <Setter Property="Background" Value="DarkOrange"/>
        </MultiTrigger>
    </Style.Triggers>
</Style>

当按钮同时被按下且鼠标悬停在上面时,按钮的背景颜色会变为深橙色。

5. 多数据触发器(MultiDataTrigger)

多数据触发器与多触发器类似,但它们基于多个数据绑定的值来触发操作。

<Style TargetType="TextBlock">
    <Style.Triggers>
        <MultiDataTrigger>
            <MultiDataTrigger.Conditions>
                <Condition Binding="{Binding IsImportant}" Value="True"/>
                <Condition Binding="{Binding IsHighlighted}" Value="True"/>
            </MultiDataTrigger.Conditions>
            <Setter Property="Foreground" Value="Purple"/>
        </MultiDataTrigger>
    </Style.Triggers>
</Style>

IsImportantIsHighlighted都为True时,文本块的字体颜色将变为紫色。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,616评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,020评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,078评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,040评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,154评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,265评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,298评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,072评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,491评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,795评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,970评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,654评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,272评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,985评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,815评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,852评论 2 351

推荐阅读更多精彩内容