【问题标题】:WPF Trigger PropertiesWPF 触发器属性
【发布时间】:2013-02-16 03:21:05
【问题描述】:

我是 WPF 的新手,目前正在使用 triggers。我有一个关于简单触发器的问题。 简单触发器,我的意思是监视dependency property 的变化并使用setter 更改样式。

例子:

<Style.Triggers>
    <Trigger Property="Control.IsFocused" Value ="True">
        <Setter Property=" Control.Foreground" Value =" DarkRed" />
    </Trigger>
</Style.Triggers>

我看到的所有示例都使用了以下trigger properties:

  • &lt;Trigger Property="Control.IsFocused" Value ="True"&gt;
  • &lt;Trigger Property="Control.IsMouseOver" Value ="True"&gt;
  • &lt;Trigger Property="Button.IsPressed" Value ="True"&gt;

问题: 这些 only 触发器属性可用吗?如果没有,还有哪些其他存在?

我在网上搜索过,但无济于事。也许有人可以对此有所了解。

【问题讨论】:

    标签: wpf xaml properties triggers


    【解决方案1】:

    使用此代码在 wpf 中获得更好的触发器体验。

    <Window x:Class="DataBinding.Trigger2"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Trigger2" Height="500" Width="500">
    <Window.Resources>
        <Style TargetType="Button">
            <Style.Setters>
                <Setter Property="FontFamily" Value="Tahoma"></Setter>
                <Setter Property="FontSize" Value="15"></Setter>
                <Setter Property="FontWeight" Value="Bold"></Setter>
                <Setter Property="Height" Value="25"></Setter>
                <Setter Property="Width" Value="100"></Setter>
    
            </Style.Setters>
            <Style.Triggers>
                <Trigger Property="IsFocused" Value="True">
                    <Setter Property="Background" Value="Purple"></Setter>
                    <Setter Property="Foreground" Value="DarkCyan"></Setter>
                    <Setter Property="FontFamily" Value="Franklin Gothic"></Setter>
                    <Setter Property="FontSize" Value="10"></Setter>
                    <Setter Property="FontWeight" Value="Normal"></Setter>
                    <Setter Property="Height" Value="50"></Setter>
                    <Setter Property="Width" Value="200"></Setter>
                </Trigger>
                <Trigger Property="IsMouseOver" Value="True">
                    <Setter Property="Background" Value="Red"></Setter>
                    <Setter Property="Foreground" Value="White"></Setter>
                    <Setter Property="FontFamily" Value="Calibri"></Setter>
                    <Setter Property="FontSize" Value="25"></Setter>
                    <Setter Property="FontWeight" Value="Heavy"></Setter>
                    <Setter Property="Height" Value="100"></Setter>
                    <Setter Property="Width" Value="400"></Setter>
                </Trigger>
                <Trigger Property="IsPressed" Value="True">
                    <Setter Property="Background" Value="Green"></Setter>
                    <Setter Property="Foreground" Value="Violet"></Setter>
                    <Setter Property="FontFamily" Value="Times New Roman"></Setter>
                    <Setter Property="FontSize" Value="20"></Setter>
                    <Setter Property="FontWeight" Value="Thin"></Setter>
                    <Setter Property="Height" Value="250"></Setter>
                    <Setter Property="Width" Value="250"></Setter>
                </Trigger>
            </Style.Triggers>
        </Style>
    </Window.Resources>
    <Button>It's a Magic.</Button>
    

    【讨论】:

      【解决方案2】:

      WPF 中有多种类型的触发器,但最常用的两种是常规的Triggers 和DataTriggers

      两种类型的触发器都会观察一个值,当它更改为匹配指定的 Value 时,它们会应用您的样式设置器。

      常规触发器可用于对象的任何依赖属性。这包括 Text、Visibility、Background 等属性以及您指定的更常见的触发属性:IsFocused、IsMouseOver 和 IsPressed。

      请注意,根据MSDN page about Trigger.Property,如果包含触发器的样式或模板具有TargetType 属性集,则无需指定类名前缀

      一个容易记住的方法是,如果你可以绑定属性,你可以在它上面设置一个触发器。

      DataTriggers 是监视绑定值而不是依赖属性的触发器。它们允许您查看绑定的表达式,并在该绑定的计算结果等于您的值时做出反应。

      例如,您可以在"{Binding Value}" 或"{Binding ElementName=MyTextBox, Path=IsChecked}" 上设置DataTrigger。您甚至可以将Converters 与DataTriggers 一起使用,例如

      <DataTrigger
          Binding="{Binding SomeInt, Converter={StaticResource IsGreaterThanZero}}"
          Value="True">
      

      【讨论】:

      • 所以对于常规触发器,没有像...Control.IsMouseDown?这样的属性
      • @Dom 我刚刚为我的答案添加了更新。如果您在包含触发器的样式或模板上设置了TargetType 属性,则不需要在触发属性上包含类名前缀。因此,如果您的TargetType 具有IsMouseDown 属性,那么您可以在IsMouseDown 上设置触发器,而不是使用Control.IsMouseDown
      • 别忘了EventTriggers。
      【解决方案3】:

      这些不是您可以在 Triggers 中使用的唯一属性,但是,它们是常见的示例,因为它们易于理解和演示。

      事实上,您可以让您的 Trigger 监视任何 DependencyProperty,但是因为它在值更改时“触发”(并且与您告诉它要监视的 Value 匹配),所以只有使用将在运行时更改的属性,通常来自用户操作(例如焦点、鼠标悬停、按下等)。在这些情况下,只有某些DependencyProperties 实际更改值,因此并非所有这些都可以在Triggers 中使用。

      Microsoft 在标准控件中添加了多个DependencyProperties,以便您可以轻松地根据更改创建触发器。但是,您也可以使用自己的 DependencyProperties 创建自己的控件,并在自定义 DependencyProperties 更改时触发响应。

      请记住,PropertyTriggers 只是 WPF 中Trigger 的一种形式。还有EventTriggers和DataTriggers和MultiTriggers。这些其他触发器基于事件或数据更改触发,或者在 MultiTriggers 多个属性(或数据)值的情况下触发。

      您想对Triggers 做一些具体的事情吗? This other answer 很好地解释了每种触发器的作用。

      【讨论】:

      • 我在回答中忘记了EventTriggers 和MultiTriggers,因为我几乎从不使用它们。谢谢你提醒我! :)
      • :)。同意@Rachel,EventTriggers 很少见。我可能只用过几次。
      猜你喜欢
      • 1970-01-01
      • 2010-12-20
      • 2016-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多