【问题标题】:Enabling TextBox with trigger使用触发器启用 TextBox
【发布时间】:2019-12-28 18:01:35
【问题描述】:

我希望禁用一个文本框,除非用户将鼠标悬停在它上面。但这不起作用,如果我将鼠标悬停在文本框上,它仍然不可编辑。 (是的,我知道这很不寻常。) 我尝试的是:

<Border>
    <TextBox Text="Hover to edit me!" IsEnabled="False" >
        <TextBox.Style>
            <Style TargetType="{x:Type TextBox}" BasedOn="{StaticResource {x:Type TextBox}}">
                <Style.Triggers>
                    <DataTrigger Binding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=Border}, Path=IsMouseOver}" Value="True">
                        <Setter Property="IsEnabled" Value="True" />
                    </DataTrigger>
                    <!-- this does not work either -->
                    <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsMouseOver}" Value="True">
                         <Setter Property="IsEnabled" Value="True" />
                    </DataTrigger>
                    <!-- neither did this -->
                    <Trigger Property="IsMouseOver" Value="True">
                        <Setter Property="IsEnabled" Value="True" />
                    </Trigger>
                </Style.Triggers>
            </Style>
        </TextBox.Style>
    </TextBox>
</Border>    

我想知道是否可以使用触发器?

【问题讨论】:

  • 可能没有抓住重点,但你为什么不直接绑定到 IsMouseOver 呢?
  • 好问题!我也试过了,但也没有用,我检查了是否可以将它绑定到外部元素,在这种情况下是 Border,也没有运气。

标签: c# wpf datatrigger


【解决方案1】:

这是因为 WPF 中的 Dependency Property Value Precedence

需要将Style中的IsEnabled属性设置为false,这样触发器才能覆盖该值。

本地值始终具有更高的优先级,因此直接在文本框中设置IsEnabled="False" 将覆盖任何样式或样式触发值。

这是一个工作示例:

  <Border>
    <TextBox Text="Text">
      <TextBox.Style>
        <Style TargetType="TextBox">
          <Setter Property="IsEnabled" Value="False"/>
          <Style.Triggers>
            <DataTrigger
                Binding="{Binding IsMouseOver,
                RelativeSource={RelativeSource FindAncestor, AncestorType=Border}}"
                Value="True">
              <Setter Property="IsEnabled" Value="True" />
            </DataTrigger>
          </Style.Triggers>
        </Style>
      </TextBox.Style>
    </TextBox>
  </Border>

【讨论】:

  • 非常感谢!我不知道值优先级。我第一次偶然发现。这确实有效。
猜你喜欢
  • 2015-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-22
  • 1970-01-01
  • 2021-05-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多