C# 为什么文本框边框颜色在WPF中保持不变?

C# 为什么文本框边框颜色在WPF中保持不变?,c#,wpf,xaml,textbox,styles,C#,Wpf,Xaml,Textbox,Styles,据我所知,我应该使用样式触发器来更新文本框的边框颜色。然而,无论我做什么,它总是变成系统默认的蓝色,而不是我指定的黑色 有人有什么想法吗 代码如下: <UserControl.Resources> <Style TargetType="TextBox"> <Style.Triggers> <Trigger Property="IsFocused" Value="True">

据我所知,我应该使用样式触发器来更新文本框的边框颜色。然而,无论我做什么,它总是变成系统默认的蓝色,而不是我指定的黑色

有人有什么想法吗

代码如下:

<UserControl.Resources>
    <Style TargetType="TextBox">
        <Style.Triggers>
            <Trigger Property="IsFocused" Value="True">
                <Setter Property="BorderBrush" Value="Black" />
            </Trigger>
        </Style.Triggers>
    </Style>
</UserControl.Resources>

尝试设置大于
1
BorderThickness
值(默认情况下):

这里有两个参数:

RenderMouseOver="{TemplateBinding IsMouseOver}"
RenderFocused="{TemplateBinding IsKeyboardFocusWithin}"
当状态为
Focus
MouseOver
时,它们负责蓝色渐变边框,并且可能在
BorderThickness
BorderBrush
上存在条件。如果它们
remove/reset
,蓝色渐变边框将消失,并且不需要为
BorderThickness
设置大于1的值

ILSpy
中,我在TextBoxBase类中找到了
ChangeVisualState(bool)
方法,如下所示:

internal override void ChangeVisualState(bool useTransitions)
{
    if (!base.IsEnabled)
    {
        VisualStateManager.GoToState(this, "Disabled", useTransitions);
    }
    else
    {
        if (this.IsReadOnly)
        {
            VisualStateManager.GoToState(this, "ReadOnly", useTransitions);
        }
        else
        {
            if (base.IsMouseOver)
            {
                VisualStateManager.GoToState(this, "MouseOver", useTransitions);
            }
            else
            {
                VisualStateManager.GoToState(this, "Normal", useTransitions);
            }
        }
    }

    if (base.IsKeyboardFocused)
    {
        VisualStateManager.GoToState(this, "Focused", useTransitions);
    }
    else
    {
        VisualStateManager.GoToState(this, "Unfocused", useTransitions);
    }

    base.ChangeVisualState(useTransitions);
}

事实证明,这些视觉状态是“系统地”实现的,并且样式不存在。

文本框的默认模板具有设置文本框边框刷的触发器。如果您想覆盖它,您需要覆盖文本框的
ControlTemplate

这就是你如何做到的:

<Style TargetType="TextBox">
    <Setter Property="Template">
       <Setter.Value>
          <ControlTemplate TargetType="TextBox">
              <Border BorderThickness="{TemplateBinding Border.BorderThickness}"
                      BorderBrush="{TemplateBinding Border.BorderBrush}"
                      Background="{TemplateBinding Panel.Background}"
                      Name="border"
                      SnapsToDevicePixels="True">
                 <ScrollViewer HorizontalScrollBarVisibility="Hidden"
                               VerticalScrollBarVisibility="Hidden"
                               Name="PART_ContentHost"
                               Focusable="False" />
              </Border>
           <ControlTemplate.Triggers>
              <Trigger Property="UIElement.IsEnabled" Value="False">
                <Setter Property="UIElement.Opacity" TargetName="border"
                        Value="0.56"/>
              </Trigger>
              <Trigger Property="UIElement.IsMouseOver" Value="True">
                <Setter Property="Border.BorderBrush" TargetName="border" 
                        Value="#FF7EB4EA"/>
              </Trigger>
              <Trigger Property="UIElement.IsKeyboardFocused" Value="True">
                <Setter Property="Border.BorderBrush" TargetName="border" 
                       Value="Black"/> <-- HERE
              </Trigger>
           </ControlTemplate.Triggers>
        </ControlTemplate>
      </Setter.Value>
    </Setter>
 </Style>


试用IsKeyboardFocusWithin@DanTonyBrown,
TextBox
有其默认模板,当focused@dowhilefor不幸的是,这不起作用:/@dkozl你会如何解决这个问题?看看并浏览一下这些样式。非常感谢你,不仅仅是因为解决了这个问题(我将厚度设置为1.01,因为我只需要1px边框)但提到操作系统,我是在Windows Server 2012上安装的…它不工作。但是它在Windows上运行7@Anatoliy-这样行吗?我在windows 8上试过,但没能让它工作。@Rohit Vats:我在windows 7下测试过,在我身上工作过。如果我没弄错的话,在XP下可以立即工作,而且设置的值不会超过1。不幸的是,在Windows 8下无法进行测试。@Rohit Vats:好的,我在TextBoxBase类中发现了一个
ChangeVisualState
方法。@Anatooly-没错,dude。它嵌入在Aero dll的主题资源文件中。+1用于抽出时间并在此处发布您的发现。:)
internal override void ChangeVisualState(bool useTransitions)
{
    if (!base.IsEnabled)
    {
        VisualStateManager.GoToState(this, "Disabled", useTransitions);
    }
    else
    {
        if (this.IsReadOnly)
        {
            VisualStateManager.GoToState(this, "ReadOnly", useTransitions);
        }
        else
        {
            if (base.IsMouseOver)
            {
                VisualStateManager.GoToState(this, "MouseOver", useTransitions);
            }
            else
            {
                VisualStateManager.GoToState(this, "Normal", useTransitions);
            }
        }
    }

    if (base.IsKeyboardFocused)
    {
        VisualStateManager.GoToState(this, "Focused", useTransitions);
    }
    else
    {
        VisualStateManager.GoToState(this, "Unfocused", useTransitions);
    }

    base.ChangeVisualState(useTransitions);
}
<Style TargetType="TextBox">
    <Setter Property="Template">
       <Setter.Value>
          <ControlTemplate TargetType="TextBox">
              <Border BorderThickness="{TemplateBinding Border.BorderThickness}"
                      BorderBrush="{TemplateBinding Border.BorderBrush}"
                      Background="{TemplateBinding Panel.Background}"
                      Name="border"
                      SnapsToDevicePixels="True">
                 <ScrollViewer HorizontalScrollBarVisibility="Hidden"
                               VerticalScrollBarVisibility="Hidden"
                               Name="PART_ContentHost"
                               Focusable="False" />
              </Border>
           <ControlTemplate.Triggers>
              <Trigger Property="UIElement.IsEnabled" Value="False">
                <Setter Property="UIElement.Opacity" TargetName="border"
                        Value="0.56"/>
              </Trigger>
              <Trigger Property="UIElement.IsMouseOver" Value="True">
                <Setter Property="Border.BorderBrush" TargetName="border" 
                        Value="#FF7EB4EA"/>
              </Trigger>
              <Trigger Property="UIElement.IsKeyboardFocused" Value="True">
                <Setter Property="Border.BorderBrush" TargetName="border" 
                       Value="Black"/> <-- HERE
              </Trigger>
           </ControlTemplate.Triggers>
        </ControlTemplate>
      </Setter.Value>
    </Setter>
 </Style>