【问题标题】:Change the focused border color of a Wpf textbox when it GotFocus()在 GotFocus() 时更改 Wpf 文本框的焦点边框颜色
【发布时间】:2017-02-02 22:57:10
【问题描述】:

我想要什么:当任何文本框有焦点时将边框颜色更改为黄色。

我尝试了什么:

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

没有快乐。无法弄清楚为什么边框仍然是蓝色的。 这是相似的,但不是 How to change the color of the Border of a TextBox when it has focus? 的重复。

【问题讨论】:

    标签: c# wpf vb.net


    【解决方案1】:

    需要修改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

    【讨论】:

    • 太棒了!现在,如果我可能会问,请解释这是如何/为什么工作而我的代码没有? #KnowingIsHalfTheBattle -- 我应该补充一下,我之前尝试过控制模板,但只有通过删除所有样式才能成功删除整个文本框。 :-/
    • 您的代码不起作用,因为 TextBox 的默认控件模板为 IsKeyboardFocused 属性定义了一个 DataTrigger,该属性将 BorderBrush 属性设置为硬编码的画笔值。这就是您需要覆盖整个模板的原因。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-14
    • 1970-01-01
    • 1970-01-01
    • 2022-11-27
    • 1970-01-01
    • 2014-06-18
    相关资源
    最近更新 更多