2009-06-05 35 views
6

Sto cercando di creare un TextBox di ricerca con un'icona di lente di ingrandimento incorporata. Ho il seguente markup finora:WPF SystemColors: colore del bordo 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> 

Tuttavia, non riesco a trovare la voce nella SystemColors che mi darà lo stesso colore del bordo di serie TextBox. Questo è un colore bluastro per impostazione predefinita. Sono davvero stupido qui?!?

MODIFICA: btw, l'immagine è contenuta in uno stackpanel perché sto progettando di inserire anche una freccia a discesa.

+0

Non penso che tu sia stupido - ho avuto lo stesso problema nel cercare di trovare il colore del bordo di un ListBox (lo stesso colore, penso). Non sono sicuro che sia emerso da nessuna parte. –

+0

Riesci a trovare un esempio del colore che desideri e ottieni i suoi valori RGB? Questo potrebbe aiutare a identificare quale colore è. – ChrisF

+0

È preferibile selezionare il valore del colore del bordo della casella di testo e utilizzarlo come bordo del pennello –

risposta

4

Si potrebbe provare a utilizzare Microsoft.Windows.Themes.ListBoxChrome anziché il bordo; questo è quello che utilizza il modello predefinito per 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> 

si dovrebbe essere in grado di utilizzare solo ListBoxChrome al posto di frontiera piuttosto che TextBox ri-template per abbinare il codice è presentato.

+0

Grazie per il suggerimento, ma sembra non funzionare. Non ho confini – Grokys

+0

Potrebbe essere necessario ri-modello TextBox (o il tuo Custom TextBox) per includere ListBoxChrome; funziona per me quando ho usato quel codice per cambiare il modello di controllo su un TextBox predefinito. –

+0

@Groky: Sembra che manchi BasedOn-Property su Style. Aveva lo stesso problema. Vedere la mia risposta per il codice (non si adatta qui) – dwonisch

2

sono stato in grado di farlo programatically con:

TextBox.BorderBrush = SystemColors.ControlDarkBrush; 
+0

Questo ha funzionato a meraviglia, evviva! – TabbyCool

+1

Questo non è il colore giusto. Ottengo un colore grigio-ish invece del blu appropriato su XP. –

1

Sembra hackish, ma ho avuto la miglior fortuna con la creazione di una casella di testo (forse crollata) e vincolante al suo pennello confine.

3

in base alla risposta di Nicholas Armstrong, che la soluzione sta funzionando per me:

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