• WPF 属性触发器示例


        在应用程序的生命周期中,用户界面中对象的状态会发生改变。通常以面向用户的术语来表述状态。例如,按钮的“鼠标悬停”状态或菜单项的“按下”状态。这两个示例状态是分别使用 UIElement.IsMouseOver 属性和 MenuItem.IsPressed 属性在对象上实现的。

        但对用户而言,这些属性的值及其代表的状态不是可见的。 IsMouseOver 和 IsPressed 都不是可视属性。为了观察这些属性,非可视属性的更改必须触发可视属性(如 Background 或 Opacity )的更改。例如,原本平整的按钮会在变为“鼠标悬停”状态后凹下去;菜单项也会在“按下”时更改背景颜色。

        除了更改状态以外,对象还会引发事件。例如,当指针越过按钮边界时,将引发 MouseEnter 和 MouseLeave 事件。同样地,事件本身也没有可视外观,因此它必须触发可视属性的更改,才能被用户注意到。

        可以在文档的根元素中或者在应用于控件的样式中创建触发器(和动画时间线)。例如,可以修改按钮的样式,以便在按钮的“按下”和“变换”状态更改时,按钮的外观能发生细微变化。应用了该样式的任何按钮都会有相同的行为。有关示例,请参阅动手试验:向按钮添加动画。

        有两种触发器:

    属性触发器通过此机制,一个属性的更改会在另一个属性中触发即时或动态更改。
    事件触发器通过此机制,事件会在属性中触发动态更改

        这里就简单的使用一个示例,展示一下属性触发:这里使用Button作为示例,改写了Button的模板,使用IsMouseOver和IsPressed属性改变控件的背景颜色。

    1. <UserControl.Resources>
    2. <Style x:Key="BtnStyle" TargetType="{x:Type Button}">
    3. <Setter Property="Height" Value="35"/>
    4. <Setter Property="HorizontalAlignment" Value="Stretch"/>
    5. <Setter Property="FontSize" Value="14"/>
    6. <Setter Property="Foreground" Value="#dddddd"/>
    7. <Setter Property="Background" Value="#454a64"/>
    8. <Setter Property="HorizontalContentAlignment" Value="Center"/>
    9. <Setter Property="VerticalContentAlignment" Value="Center"/>
    10. <Setter Property="Template">
    11. <Setter.Value>
    12. <ControlTemplate TargetType="{x:Type Button}">
    13. <Border x:Name="bd" Background="{TemplateBinding Background}" CornerRadius="5">
    14. <StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
    15. <Image x:Name="img_path" Source="/WPFControlStyle;component/Resources/Images/status.png" Width="20" Height="20" Margin="5 0" Stretch="Fill"/>
    16. <TextBlock Text="{TemplateBinding Content}" HorizontalAlignment="{TemplateBinding HorizontalAlignment}" VerticalAlignment="{TemplateBinding VerticalAlignment}" FontSize="{TemplateBinding FontSize}" Foreground="{TemplateBinding Foreground}"/>
    17. StackPanel>
    18. Border>
    19. <ControlTemplate.Triggers>
    20. <DataTrigger Binding="{Binding IsShow}" Value="False">
    21. <Setter Property="Visibility" Value="Collapsed" TargetName="img_path"/>
    22. DataTrigger>
    23. <Trigger Property="Tag" Value="LeftBottom">
    24. <Setter Property="CornerRadius" Value="0,0,0,5" TargetName="bd"/>
    25. Trigger>
    26. <Trigger Property="Tag" Value="RightBottom">
    27. <Setter Property="CornerRadius" Value="0,0,5,0" TargetName="bd"/>
    28. Trigger>
    29. ControlTemplate.Triggers>
    30. ControlTemplate>
    31. Setter.Value>
    32. Setter>
    33. <Style.Triggers>
    34. <Trigger Property="IsMouseOver" Value="True">
    35. <Setter Property="Background" Value="#007dc0"/>
    36. Trigger>
    37. <Trigger Property="IsPressed" Value="True">
    38. <Setter Property="Background" Value="Orange"/>
    39. Trigger>
    40. Style.Triggers>
    41. Style>
    42. UserControl.Resources>

    调用样式代码

    1. <StackPanel Margin="10" Orientation="Horizontal" HorizontalAlignment="Center" VerticalAlignment="Top">
    2. <Button Style="{StaticResource BtnStyle}" Tag="LeftBottom" Width="120" Height="45" HorizontalAlignment="Center" VerticalAlignment="Center" Content="触发器测试" Click="Button_Click"/>
    3. <Button Margin="5 0" Style="{StaticResource BtnStyle}" Tag="RightBottom" Width="120" Height="45" HorizontalAlignment="Center" VerticalAlignment="Center" Content="触发器测试"/>
    4. StackPanel>

    后台代码:通过数据触发器触发,控制按钮中图标的显示或者隐藏

    1. public partial class ButtonStyleUserControl : UserControl, INotifyPropertyChanged
    2. {
    3. public ButtonStyleUserControl()
    4. {
    5. InitializeComponent();
    6. this.DataContext = this;
    7. IsShow = false;
    8. }
    9. private bool isShow = false;
    10. public bool IsShow
    11. {
    12. get { return isShow; }
    13. set
    14. {
    15. isShow = value;
    16. OnPropertyChanged("IsShow");
    17. }
    18. }
    19. public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
    20. protected void OnPropertyChanged(string propertyName)
    21. {
    22. if (PropertyChanged != null)
    23. {
    24. PropertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
    25. }
    26. }
    27. private void Button_Click(object sender, RoutedEventArgs e)
    28. {
    29. IsShow = !IsShow;
    30. }
    31. }

    执行代码运行效果图:

    当鼠标移动在按钮上时,触发IsMouseOver属性,按钮背景色变为蓝色;

    当鼠标在按钮上,按下时,触发IsPressed属性,按钮背景色变为橙色;

    点击第一个按钮后,数据触发器触发,显示了按钮中的图标。

    扩展:

    通常,一个属性与一组相应的事件相对应,您可以决定是设计一个属性触发器,还是设计两个事件触发器。例如,可以使用 IsMouseOver 属性触发器,或者成对使用 MouseEnter 和 MouseLeave 事件触发器来实现相同的效果。应尽可能使用属性触发器,而在不得不使用事件触发器时才使用它(例如,未使用样式或模板时)。

    **************************************************************************************************************

  • 相关阅读:
    如何自定义feign方法级别的超时时间
    C++枚举
    删除元素(带过渡动画)
    【计算机网络】
    buildadmin+tp8表格操作(1)----表头上方添加按钮和自定义按钮
    Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之三 简单人脸眼睛检测添加睫毛效果
    Adobe Indesign 操作
    delete删除后怎么恢复文件?四种方法进行找回
    用关键词搜索店铺列表详情
    机器学习分类方法
  • 原文地址:https://blog.csdn.net/BYH371256/article/details/132687524