0

如何更改 Combobox.Background?由于 Windows 8 ComboBox.Background=Brushes.Red 对 ComboBox 没有影响

4

2 回答 2

2

我偶然发现了同样的问题,它把我带到了这里。

亚历克斯的回答给了我一个想法,在查看了 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 曾经尝试修复相关问题并修改模板,这可能会失败,并且很可能会失败.

于 2015-04-27T19:49:13.393 回答
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);
                }
            }
        }
    }
}
于 2013-03-20T01:53:23.107 回答