如何更改Combobox.Background?
自Windows 8起
ComboBox.Background=Brushes.Red
对ComboBox没有影响
答案 0 :(得分:2)
我偶然发现了同样的问题,它把我带到了这里。
Alex的回答给了我一个想法,在查看了Windows 8 ComboBox的控件模板之后,我找到了这个解决方案:
private void ComboBox_Loaded(Object sender, RoutedEventArgs e)
{
var comboBox = sender as ComboBox;
var comboBoxTemplate = comboBox.Template;
var toggleButton = comboBoxTemplate.FindName("toggleButton", comboBox) as ToggleButton;
var toggleButtonTemplate = toggleButton.Template;
var border = toggleButtonTemplate.FindName("templateRoot", toggleButton) as Border;
border.Background = new SolidColorBrush(Colors.Red);
}
这个解决方案的优点在于它非常简单,但它有一个缺点:它似乎覆盖了所有状态,所以鼠标悬停等方面的视觉反馈很少。如果我想出一个更好的主意,我会编辑我的答案。
只需确保添加一些错误检查,因为只要代码在Windows 8.x以外的系统上执行,或者Microsoft试图解决有问题的问题,这可能会,也可能会失败。修改模板。
答案 1 :(得分:1)
我知道现在已经很晚了,但我找到了一些解决方法。只需使用更正的ComboBox。
using System.Windows.Controls;
using System.Windows;
using System.Windows.Data;
namespace Utils {
class ComboBoxWin8 : ComboBox {
public ComboBoxWin8() {
Loaded += ComboBoxWin8_Loaded;
}
void ComboBoxWin8_Loaded(object sender, RoutedEventArgs e) {
ControlTemplate ct = Template;
Border border = ct.FindName("Border", this) as Border;
// if Windows8
if (border != null) {
border.Background = Background;
// In the case of bound property
BindingExpression be = GetBindingExpression(ComboBoxWin8.BackgroundProperty);
if (be != null) {
border.SetBinding(Border.BackgroundProperty, be.ParentBindingBase);
}
}
}
}
}