为什么我的文本框对 ControlTemplate 样式中的 IsMouseOver 没有反应

Why doesn't my Textbox react on IsMouseOver in the Style for the ControlTemplate

所以我尝试稍微调整一下我的 TextBox 的样式,当时的想法是我想在将鼠标悬停在 TextBox 上时调整 BorderBrush 的样式,但由于某种原因它没有更改边框,所以我也尝试更改背景, 那里也一样。就在那时我意识到它不会对 IsMouseOver 做出反应,但它确实设置了背景和我所做的所有其他事情,这只是它没有反应的事件 IsMouseOver

控制

<TextBox Width="700"
         Height="340"
         HorizontalAlignment="Right"
         Margin="0,0,230,140"
         Foreground="#8bf502"
         TextWrapping="Wrap"
         Style="{DynamicResource TextboxStyle}"/>

风格

<Style TargetType="{x:Type TextBox}" x:Key="TextboxStyle">
    <Setter Property="OverridesDefaultStyle" Value="True"></Setter>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="TextBox">
                <Border Background="#424242">
                    <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"></ContentPresenter>
                </Border>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsMouseOver" Value="True">
                        <Setter Property="BorderBrush" Value="Orange"></Setter>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

要更改边框的背景,请为边框命名并将 TargetName="MyBorder" 添加到 Setter

您缺少 TargetNameBorderThickness:

<Style TargetType="{x:Type TextBox}" x:Key="TextboxStyle">
    <Setter Property="OverridesDefaultStyle" Value="True"></Setter>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="TextBox">
                <Border Name="border" BorderThickness="2" Background="#424242">
                    <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"></ContentPresenter>
                </Border>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsMouseOver" Value="True">
                        <Setter TargetName="border" Property="BorderBrush" Value="Orange"></Setter>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

没有 Border 除非你将它的 BorderThickness 属性 设置为 0 以外的其他值。

您正在使用自定义 Template,但您的模板不应用模板 TextBox 的边框属性。尝试将以下内容添加到模板中的 Border 元素:

BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"

实际上有几种方法可以解决这个问题:使用模板绑定并将触发器放在 Style 中;使用模板绑定并将触发器放在模板中;使用明确的目标元素并将触发器放在模板中(正如其他人所建议的那样);等 "right" 方法取决于 how/if 您希望控件在 属性 更改时做出响应。例如:如果有人直接在 TextBox 上设置了一个新的 BorderBrush,您是否希望它取代您的橙色悬停效果?值得阅读依赖属性的 value precedence 以了解某些属性的设置方式和位置的含义。

值得注意的是,您的模板不完整,如果您希望文本可编辑(或可选择),则无法使用。 TextBox 期望它的模板有一个特别命名的 ScrollViewer,可以在其中注入可编辑的文本视图。尝试用以下内容替换您的 ContentPresenter

<ScrollViewer x:Name="PART_ContentHost"
              Padding="{TemplateBinding Padding}" />

请注意 x:Name 属性必须完全匹配。