当Wpf文本框得到焦点时,更改其聚焦边框颜色

17

我想要的是:当任何文本框获得焦点时,将边框颜色更改为黄色。

我尝试过:

<Window.Resources>
    <Style TargetType="TextBox">
        <Style.Triggers>
            <Trigger Property="IsFocused" Value="True">
                <Setter Property="BorderBrush" Value="Yellow"></Setter>
                <Setter Property="BorderThickness" Value="1"></Setter>
            </Trigger>
        </Style.Triggers>
    </Style>
</Window.Resources>

无法成功。无法弄清为什么边框仍然是蓝色。 这相似,但不是重复的如何在TextBox获得焦点时更改其边框的颜色?

1个回答

39
你需要修改TextBox的控制模板,仅仅在样式中添加触发器是不够的。这应该可以解决问题:
<Style TargetType="TextBox">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type TextBox}">
                <Border x:Name="border" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" SnapsToDevicePixels="True">
                    <ScrollViewer x:Name="PART_ContentHost" Focusable="false" HorizontalScrollBarVisibility="Hidden" VerticalScrollBarVisibility="Hidden"/>
                </Border>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsEnabled" Value="false">
                        <Setter Property="Opacity" TargetName="border" Value="0.56"/>
                    </Trigger>
                    <Trigger Property="IsMouseOver" Value="true">
                        <Setter Property="BorderBrush" TargetName="border" Value="#FF7EB4EA"/>
                    </Trigger>
                    <Trigger Property="IsFocused" Value="true">
                        <Setter Property="BorderBrush" TargetName="border" Value="Yellow"/>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
你可以在WPF源代码中找到原始的样式模板:https://github.com/dotnet/wpf/blob/c271205b80c27df976acbd7236ec637090d127c1/src/Microsoft.DotNet.Wpf/src/Themes/XAML/TextBox.xaml#L415-L441

太棒了!现在,如果可以的话,请解释一下为什么这个能工作而我的代码不行?#知道是成功的一半 -- 我应该补充说,我之前尝试过控件模板,但只能通过移除所有样式以完全删除文本框来取得成功。 :-/ - DrDamnit
2
你的代码无法正常工作,因为TextBox的默认控件模板定义了一个DataTrigger,用于将BorderBrush属性设置为硬编码的画刷值,以响应IsKeyboardFocused属性。这就是为什么你需要覆盖整个模板的原因。 - mm8

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接