使用触发器启用 TextBox

Enabling TextBox with trigger

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

<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>    

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

这是因为 WPF 中的Dependency Property Value Precedence

您需要将 IsEnabled 属性 设置为 Style 中的 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>