2009-06-05 6 views
6

J'essaie de faire une recherche TextBox avec une icône de loupe intégrée. Je le balisage suivant jusqu'à présent:WPF SystemColors: couleur de la bordure 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> 

Cependant, je ne trouve pas l'entrée en SystemColors qui me donnera la même couleur que la frontière standard TextBox. C'est une couleur bleuâtre par défaut. Suis-je vraiment stupide ici?!?

EDIT: btw, l'image est contenue dans un panneau de pile parce que j'ai l'intention d'y placer une flèche déroulante.

+0

Je ne pense pas que vous êtes stupide - j'ai eu le même problème en essayant de trouver la couleur de la bordure d'une ListBox (la même couleur, je pense). Je ne suis pas sûr que ce soit apparu nulle part. –

+0

Pouvez-vous trouver un exemple de la couleur que vous voulez et obtenir ses valeurs RVB? Cela pourrait aider à identifier de quelle couleur il s'agit. – ChrisF

+0

Mieux choisir la valeur de couleur de la bordure de la zone de texte, et l'utiliser comme borderbrush –

Répondre

4

Vous pouvez essayer d'utiliser Microsoft.Windows.Themes.ListBoxChrome à la place de la bordure; c'est ce que le modèle par défaut pour TextBox utilise:

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

Vous devriez être en mesure d'utiliser juste ListBoxChrome au lieu de frontière plutôt que de re-templating TextBox pour correspondre au code que vous avez présenté.

+0

Merci pour la suggestion, mais cela ne semble pas fonctionner. Je n'ai pas de frontière. – Grokys

+0

Vous devrez peut-être re-template TextBox (ou votre TextBox personnalisé) pour inclure ListBoxChrome; cela fonctionne pour moi quand j'ai utilisé ce code pour changer le modèle de contrôle sur un TextBox par défaut. –

+0

@Groky: Il semble qu'il vous manque BasedOn-Property sur Style. Avait le même problème. Voir ma réponse pour le code (il ne rentre pas ici) – dwonisch

2

j'ai pu le faire avec programatically:

TextBox.BorderBrush = SystemColors.ControlDarkBrush; 
+0

Cela a fonctionné un régal, cheers! – TabbyCool

+1

Ce n'est pas la bonne couleur. Je reçois une couleur grise au lieu du bleu correct sur XP. –

1

Il semble hackish, mais j'ai eu la meilleure chance en créant une zone de texte (peut-être effondré) et se lier à sa brosse frontière.

3

Sur la base de la réponse de Nicholas Armstrong, cette solution fonctionne pour moi:

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