WPF系统颜色:文本框边框的颜色

8
我正在尝试制作一个带有嵌入式放大镜图标的搜索文本框。到目前为止,我已经编写了以下标记:
<Border DockPanel.Dock="Bottom" Margin="2,4,0,4" 
        BorderThickness="1" SnapsToDevicePixels="True" 
        BorderBrush="{DynamicResource {x:Static SystemColors.ControlDarkBrushKey}}">
    <DockPanel>
        <StackPanel Orientation="Horizontal" DockPanel.Dock="Right">
            <Image Source="/Resources/search-13x13.png" Width="13"/>
        </StackPanel>
        <TextBox Name="searchTextBox" DockPanel.Dock="Bottom" BorderThickness="0" 
                 Text="{Binding FilterText, UpdateSourceTrigger=PropertyChanged}"/>
    </DockPanel>
</Border>

然而,我在SystemColors中找不到与标准TextBox边框相同的颜色。默认情况下,这是一种蓝色。我是否非常愚蠢?!

编辑:顺便说一句,图像包含在一个stackpanel中,因为我计划在那里放置一个下拉箭头。


我不认为你很愚蠢——我也曾经尝试过查找ListBox边框的颜色(我认为是相同的颜色)。我不确定它是否已经被公开。 - Matt Hamilton
你能找到你想要的颜色的示例并获取它的RGB值吗?这可能有助于确定它是哪种颜色。 - ChrisF
最好选择文本框边框的颜色值,并将其用作BorderBrush。 - Prashant Cholachagudda
5个回答

5
你可以尝试使用Microsoft.Windows.Themes.ListBoxChrome替代Border,这是TextBox默认模板使用的内容:
<ControlTemplate TargetType="TextBoxBase" 
                 xmlns:mwt="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero">
    <mwt:ListBoxChrome Name="Bd" SnapsToDevicePixels="True">
        <ScrollViewer Name="PART_ContentHost" 
                      SnapsToDevicePixels="{TemplateBinding UIElement.SnapsToDevicePixels}" />
    </mwt:ListBoxChrome>
    <ControlTemplate.Triggers>
        <Trigger Property="UIElement.IsEnabled" Value="False">
            <Setter TargetName="Bd" Property="Panel.Background" 
                    Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}" />
            <Setter Property="TextElement.Foreground" 
                    Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/>
        </Trigger>
    </ControlTemplate.Triggers>
</ControlTemplate>

您可以直接使用ListBoxChrome而不是重新模板化TextBox来匹配您提供的代码。


谢谢您的建议,但似乎不起作用。我没有边框。 - Grokys
你可能需要重新设计 TextBox(或自定义的 TextBox)以包含 ListBoxChrome;当我使用该代码更改默认 TextBox 上的控件模板时,它对我有效。 - Nicholas Armstrong
@Groky:看起来你在Style上缺少BasedOn-Property。 我也遇到了同样的问题。请查看我的答案获取代码(它无法适应此处)。 - dwonisch

4
我能通过以下代码以程序方式获取它:
TextBox.BorderBrush = SystemColors.ControlDarkBrush;

2
这不是正确的颜色。在XP上,我得到了一种灰蓝色而不是正确的蓝色。 - Merlyn Morgan-Graham

3

根据Nicholas Armstrong的答案,这个解决方案对我有用:

<Style TargetType="{x:Type local:CustomTextBox}" BasedOn="{StaticResource {x:Type TextBox}}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type local:CustomTextBox}">
                <mwt:ListBoxChrome x:Name="Bd" SnapsToDevicePixels="true" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" RenderFocused="{TemplateBinding IsKeyboardFocusWithin}" RenderMouseOver="{TemplateBinding IsMouseOver}">
                        <ScrollViewer x:Name="PART_ContentHost" />
                </mwt:ListBoxChrome>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsEnabled" Value="false">
                        <Setter Property="Background" TargetName="Bd" Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/>
                        <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

3

1

看起来有些取巧,但我曾经通过创建一个文本框(可能是折叠的)并绑定其边框刷子来获得最好的运气。


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