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>