WPF SystemColors: цвет границы TextBox - PullRequest
7 голосов
/ 05 июня 2009

Я пытаюсь сделать поиск TextBox со встроенным значком увеличительного стекла. Пока у меня есть следующая разметка:

<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. Это синий цвет по умолчанию. Я действительно тупой здесь?!?

РЕДАКТИРОВАТЬ: кстати, изображение содержится в стековой панели, потому что я планирую добавить туда стрелку раскрывающегося списка.

Ответы [ 5 ]

4 голосов
/ 09 августа 2011

Всем, кто ищет список кистей и как будут выглядеть их цвета с разными темами / ОС

Я бы посмотрел здесь: http://blogs.msdn.com/b/wpf/archive/2010/11/30/systemcolors-reference.aspx

4 голосов
/ 05 июня 2009

Вы можете попробовать использовать 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 вместо Border, а не заново создавать шаблон TextBox для соответствия представленному вами коду.

3 голосов
/ 25 мая 2012

Исходя из ответа Николаса Армстронга, это решение работает для меня:

<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>
2 голосов
/ 15 января 2010

Я смог получить его программно:

TextBox.BorderBrush = SystemColors.ControlDarkBrush;
1 голос
/ 17 марта 2011

Это кажется хакерским, но мне больше всего повезло, создав текстовое поле (возможно, свернутое) и привязав его к границе.

...