2012-03-28 31 views
4

Ich habe eine Combobox in WPF-MVVM und ich habe die Combobox mit Änderungen in der Pop-Down-Box und Textfeld der Combobox gestylt.Wie ändere ich WPF ComboBox SelectedText BackGround Color?

Wenn ich die Combobox-Liste blättern, ist ihr Hintergrund rosa ist, was ich gefunden habe. Nach der Auswahl eines Elements aus der Combobox-Liste hat der ausgewählte Wert im Combobox-Objekt einen blauen Hintergrund. Dies ist der Standardwert für eine Combobox in Windows Form und WPF.

Siehe das Bild für weitere Details.

enter image description here

Wie kann ich das SelectedText Hintergrundfarbe in der Combobox Textbox-Steuerelement

Die Combobox ändern hat

IsEditable=True Eigenschaft

gesetzt
+0

Kann jemand das Bild zu dieser Frage hinzufügen. Es funktioniert nicht für mich. –

Antwort

2
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <ResourceDictionary.MergedDictionaries> 
     <ResourceDictionary Source="Brushes.xaml"/> 
    </ResourceDictionary.MergedDictionaries> 

    <ControlTemplate TargetType="ToggleButton" x:Key="ComboBoxToggleButtonTemplate"> 
     <Grid> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition /> 
       <ColumnDefinition Width="20" /> 
      </Grid.ColumnDefinitions> 
      <Border BorderBrush="{StaticResource LightBrush}" 
        CornerRadius="0" 
        BorderThickness="1" 
        Name="Border" 
        Background="{StaticResource WhiteBrush}" 
        Grid.ColumnSpan="2" /> 
      <Border Margin="1" 
      BorderBrush="{StaticResource DarkBrush}" 
      CornerRadius="0" 
      BorderThickness="0" 
      Background="{StaticResource WhiteBrush}" 
      Grid.Column="0" /> 
      <Path   
      Data="M0,0L4,4 8,0z" 
      HorizontalAlignment="Center" 
      Fill="{DynamicResource DefaultBrush}" 
      Name="Arrow" 
      VerticalAlignment="Center" 
      Width="8" 
      Grid.Column="1" /> 
     </Grid> 
     <ControlTemplate.Triggers> 
      <Trigger Property="ToggleButton.IsChecked" Value="True"> 
       <Setter Property="Panel.Background" TargetName="Border" Value="{DynamicResource DefaultBrush}"/> 
       <Setter Property="Shape.Fill" TargetName="Arrow" Value="{StaticResource WhiteBrush}"/> 
       <Setter Property="Border.BorderBrush" TargetName="Border" Value="{DynamicResource DefaultBrush}"/> 
       <Setter Property="Border.BorderThickness" TargetName="Border" Value="1,1,1,0"></Setter> 
      </Trigger> 
      <Trigger Property="UIElement.IsEnabled" Value="False"> 
       <Setter Property="Panel.Background" TargetName="Border" Value="{StaticResource DisabledBackgroundBrush}"/> 
       <Setter Property="Border.BorderBrush" TargetName="Border" Value="{StaticResource DisabledBorderBrush}"/> 
       <Setter Property="TextElement.Foreground" Value="{StaticResource DisabledForegroundBrush}"/> 
       <Setter Property="Shape.Fill" TargetName="Arrow" Value="#66FFFFFF"/> 
      </Trigger> 
     </ControlTemplate.Triggers> 
    </ControlTemplate>  
    <ControlTemplate TargetType="TextBox" x:Key="ComboBoxTextBoxTemplate"> 
     <Border 
     Name="PART_ContentHost" Background="{DynamicResource LightDefaultBrush}" 
     Focusable="False" />     
    </ControlTemplate>  
    <Style TargetType="{x:Type ComboBoxItem}"> 
     <Setter Property="UIElement.SnapsToDevicePixels" Value="True"/> 
     <Setter Property="FrameworkElement.FocusVisualStyle" Value="{x:Null}"/> 
     <Setter Property="TextElement.Foreground" Value="{StaticResource ForeGroundBrush}"/> 
     <Setter Property="FrameworkElement.OverridesDefaultStyle" Value="True"/> 
     <Setter Property="Control.Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type ComboBoxItem}"> 
        <Border 
       Name="Border" 
       SnapsToDevicePixels="True" 
       Padding="3,2,2,2"> 
         <ContentPresenter 
       ContentTemplate="{TemplateBinding ContentControl.ContentTemplate}" 
       Content="{TemplateBinding ContentControl.Content}" /> 
        </Border> 
        <ControlTemplate.Triggers> 
         <Trigger Property="ComboBoxItem.IsHighlighted" Value="True"> 
          <Setter Property="Panel.Background" TargetName="Border" Value="{DynamicResource DefaultBrush}"/>        
          <Setter Property="TextElement.Foreground" Value="White"></Setter> 
         </Trigger> 
         <Trigger Property="UIElement.IsEnabled" Value="False"> 
          <Setter Property="TextElement.Foreground" Value="{StaticResource DisabledForegroundBrush}"/> 
         </Trigger> 
        </ControlTemplate.Triggers> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
    <Style TargetType="{x:Type ComboBox}"> 
     <Setter Property="UIElement.SnapsToDevicePixels" Value="True"/> 
     <Setter Property="FrameworkElement.OverridesDefaultStyle" Value="True"/> 
     <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Auto"/> 
     <Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Auto"/> 
     <Setter Property="ScrollViewer.CanContentScroll" Value="True"/> 
     <Setter Property="TextElement.Foreground" Value="{StaticResource ForeGroundBrush}"/> 
     <Setter Property="FrameworkElement.FocusVisualStyle" Value="{x:Null}"/> 
     <Setter Property="Height" Value="25"></Setter> 
     <Setter Property="Margin" Value="0,2,0,2"></Setter> 
     <Setter Property="Control.Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="ComboBox"> 
        <Grid> 
         <ToggleButton 
       ClickMode="Press" 
       Name="ToggleButton" 
       IsChecked="{Binding Path=IsDropDownOpen, RelativeSource={RelativeSource TemplatedParent}, Mode=TwoWay}" 
       Focusable="False" 
       Grid.Column="2" 
       Template="{StaticResource ComboBoxToggleButtonTemplate}"/> 
         <ContentPresenter 
       Margin="3,3,23,3" 
       HorizontalAlignment="Left" 
       Name="ContentSite" 
       VerticalAlignment="Center" 
       ContentTemplate="{TemplateBinding ComboBox.SelectionBoxItemTemplate}" 
       Content="{TemplateBinding ComboBox.SelectionBoxItem}" 
       IsHitTestVisible="False" /> 
         <TextBox 
       Margin="3,1,1,1" 
       Visibility="Hidden" 
       HorizontalAlignment="Left" 
       Name="PART_EditableTextBox" 
       Background="Transparent" 
       VerticalAlignment="Center" 
       Style="{x:Null}" 
       IsReadOnly="False" 
       Focusable="False" 
       xml:space="preserve"        
       Template="{StaticResource ComboBoxTextBoxTemplate}"/> 
      <Popup 
       Placement="Bottom" 
       Name="Popup" 
       Focusable="False"    
       AllowsTransparency="True"    
       IsOpen="{TemplateBinding ComboBox.IsDropDownOpen}" 
       PopupAnimation="Slide"> 
       <Grid 
        MinWidth="{TemplateBinding FrameworkElement.ActualWidth}" 
        MaxHeight="{TemplateBinding ComboBox.MaxDropDownHeight}" 
        Name="DropDown" 
        SnapsToDevicePixels="True"> 
       <Border 
        BorderBrush="{DynamicResource DefaultBrush}" 
        BorderThickness="1,1,1,1" 
        Name="DropDownBorder" 
        Background="{StaticResource WhiteBrush}"/> 
       <ScrollViewer Margin="1,0,1,0" 
        SnapsToDevicePixels="True"> 
        <ItemsPresenter 
         KeyboardNavigation.DirectionalNavigation="Contained" /> 
       </ScrollViewer> 
       </Grid> 
      </Popup> 
      </Grid> 
        <ControlTemplate.Triggers> 
         <Trigger Property="ItemsControl.HasItems" Value="False"> 
          <Setter Property="FrameworkElement.MinHeight" TargetName="DropDownBorder" Value="95"/> 
         </Trigger> 
         <Trigger Property="UIElement.IsEnabled" Value="False"> 
          <Setter Property="TextElement.Foreground" Value="{StaticResource DisabledForegroundBrush}"/> 
         </Trigger> 
         <Trigger Property="ItemsControl.IsGrouping" Value="True"> 
          <Setter Property="ScrollViewer.CanContentScroll" Value="False"/> 
         </Trigger> 
         <Trigger Property="Window.AllowsTransparency" SourceName="Popup" Value="True"> 
          <Setter Property="Border.CornerRadius" TargetName="DropDownBorder" Value="0"/> 
          <Setter Property="Border.BorderThickness" TargetName="DropDownBorder" Value="1,0,1,1"/> 
          <Setter Property="FrameworkElement.Margin" TargetName="DropDownBorder" Value="0,0,0,0"/> 
         </Trigger> 
         <Trigger Property="ComboBox.IsEditable" Value="True"> 
          <Setter Property="KeyboardNavigation.IsTabStop" Value="False"/> 
          <Setter Property="UIElement.Visibility" TargetName="PART_EditableTextBox" Value="Visible"/> 
          <Setter Property="UIElement.Visibility" TargetName="ContentSite" Value="Hidden"/> 
         </Trigger> 
        </ControlTemplate.Triggers> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
</ResourceDictionary> 
+0

Dies ist mein Combobox-Stil, aber meine Combobox Bordercolor ändert sich nicht auf Tab-Fokus –

+0

Das Problem mit deaktivierten Elementen mit eigenen Vordergrundfarben: Sie werden nicht grau dargestellt. Wie behebt man: Geben Sie im 'ComboBoxItem'-Stil dem Content-Presenter'

7

Sie können dies tun:

<ComboBox.Resources> 
    <!--Selected color when the ComboBox is focused--> 
    <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Yellow" /> 
    <!--Selected color when the ComboBox is not focused--> 
    <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="Yellow" /> 

    <!--selected text--> 
    <SolidColorBrush x:Key="{x:Static SystemColors.HighlightTextBrushKey}" Color="Yellow" /> 
</ComboBox.Resources> 

(auf ListBox getestet, sollte aber funktionieren)

Ein anderer Weg, um die ItemContainerStyle Eigenschaft der ComboBox setzt, und habe einen Trigger auf dem aktuellen ComboBoxItem Auswahlzustand abhängig:

<ComboBox> 
    <ComboBox.Resources> 
    <Style TargetType="TextBlock"> 
     <Style.Triggers> 
     <DataTrigger Binding="{Binding IsSelected, RelativeSource={RelativeSource AncestorType=ComboBoxItem}}" Value="True"> 
      <Setter Property="Foreground" Value="White" /> 
     </Trigger> 
     </Style.Triggers> 
    </Style> 
    </ComboBox.Resources> 
    <ComboBox.ItemContainerStyle> 
    <Style TargetType="ComboBoxItem" x:Key="ContainerStyle"> 
     <Style.Triggers> 
     <Trigger Property="IsSelected" Value="True"> 
      <Setter Property="Background" Value="Red" /> 
     </Trigger> 
     </Style.Triggers> 
    </Style> 
    </ComboBox.ItemContainerStyle>  
</ComboBox> 
+0

Danke, Es funktioniert .. Aber lassen Sie mich implementieren, wo ich muss. –

+0

@KishoreJangid sollten Sie irgendwelche Probleme haben, zögern Sie nicht, wieder einzuchecken ... – Shimmy

+0

Es ändert nur die Farbe der Combobox Element. Ich möchte die Farbe des ausgewählten Elements in der TextBox –

2

In Ihrem PART_EditableTextBox der SelectionBrush-Eigenschaft steuert diesen Hintergrund für das ausgewählte Element. Im folgenden Code setze ich es auf transparent, so dass es nicht hervorhebt.

<TextBox x:Name="PART_EditableTextBox" 
    Margin="3,3,18,3" 
    HorizontalAlignment="Left" 
    VerticalAlignment="Center" 
    Background="Transparent" 
    Focusable="True" 
    SelectionBrush="Transparent" 
    Foreground="{TemplateBinding Foreground}" 
    IsReadOnly="{TemplateBinding IsReadOnly}" 
    Style="{x:Null}" 
    Template="{StaticResource ComboBoxTextBox}" 
    Visibility="Visible" /> 
Verwandte Themen