2013-02-12 68 views

回答

2

這裏有一個稍微天真的做法:

<ComboBox 
    ItemsSource="{x:Static Fonts.SystemFontFamilies}" 
    Width="100" 
    > 
    <ComboBox.Style> 
    <Style TargetType="ComboBox"> 
     <Setter Property="Background" Value="Green" /> 
     <Style.Triggers> 
     <Trigger Property="IsDropDownOpen" Value="True"> 
      <Setter Property="Background" Value="Red" /> 
     </Trigger> 
     </Style.Triggers> 
    </Style> 
    </ComboBox.Style> 
</ComboBox> 

最初,這臺Background屬性Green,但安排它去Red下拉出現時。但是,有兩個問題:

  1. 在某些Windows主題(例如,在Vista和Windows 7中使用Aero主題),綠色背景被通過主題使用指示藍色顏色掩蓋了下拉的按鈕已被按下。所以按鈕在淡入青色之前會短暫地變綠。
  2. ComboBox.Background屬性隻影響按鈕本身的外觀,而不影響下拉列表。有可能你想要做的是改變彈出部分的背景顏色。

如果2是你想要的,這樣做的伎倆:

<ComboBox 
    ItemsSource="{x:Static Fonts.SystemFontFamilies}" 
    Width="100"  > 
    <ComboBox.Resources> 
    <Style TargetType="ComboBoxItem"> 
     <Setter Property="Background" Value="Orange" /> 
    </Style> 
    </ComboBox.Resources> 
</ComboBox> 

嚴格地說,這實際上改變出現在下拉列表中ComboBoxItem控制的背景顏色,但將產生預期的效果。

但是,如果您想修復1,則需要自定義模板,因爲內置的ComboBox模板並不能真正爲Background屬性提供很好的支持,因爲它會更改按鈕部分的顏色在各種情況下。 Aero主題的外觀ComboBox實際上不是爲支持自定義背景色而設計的,因此您需要爲控件創建自己的自定義外觀。

0

好了,要回答你的代碼背後的問題:

項添加到您的組合框:

foreach (String tag in tags) 
{ 
    ComboBoxItem item = new ComboBoxItem(); 
    item.Content = tag; 
    cbTags.Items.Add(item); 
} 

然後你就可以修改項目的背景顏色:

((ComboBox)o).Background = GetBrushByRGB(r, g, b); 
foreach (ComboBoxItem item in ((ComboBox)o).Items) 
{ 
    item.Background = GetBrushByRGB(r, g, b); 
} 

所以基本上你需要改變ComboBoxItem的背景顏色。

0

首先,您需要獲取Combobox的默認模板(如果需要它們,請參閱下面的詳細信息)。然後,把這個XAML的第一個「ControlTemplate.Triggers」標籤內:

<DataTrigger Binding="{Binding IsDropDownOpen, RelativeSource={RelativeSource TemplatedParent}}" Value="True"> 
    <Setter Property="Background" TargetName="templateRoot" Value="Red"/> 
</DataTrigger> 

你的組合框按鈕爲紅色時的下拉是開放的。

獲取默認模板:在Visual Studio 2015中,以設計模式查看您的頁面。然後,右鍵單擊組合框,然後選擇「編輯模板 - >編輯副本」。這將爲您生成默認模板。