C# 在Windows 8中更改组合框背景色

C# 在Windows 8中更改组合框背景色,c#,wpf,windows,C#,Wpf,Windows,如何更改Combobox.Background? 从Windows8开始 ComboBox.Background=brusks.Red 对ComboBox没有影响我知道时间不早了,但我已经找到了解决方法。只需使用正确的组合框 using System.Windows.Controls; using System.Windows; using System.Windows.Data; namespace Utils { class ComboBoxWin8 : ComboBox {

如何更改Combobox.Background? 从Windows8开始
ComboBox.Background=brusks.Red

对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);
                }
            }
        }
    }
}

我知道很晚了,但我已经找到了解决办法。只需使用正确的组合框

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);
                }
            }
        }
    }
}

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

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试图解决问题并修改模板,这可能会失败。

我也遇到了同样的问题,它把我带到了这里

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试图解决问题并修改模板,这可能会失败。

尝试在app.xaml资源中添加以下行:
我需要动态执行此操作(取决于条件,它应该有不同的颜色)。尝试在你的应用程序中添加以下行。xaml资源:
我需要动态执行此操作(取决于条件,它应该有不同的颜色)。你在win8中尝试过吗?它对我无效。(边框为null)我还检查了_childNames私有数组并尝试了“DropDownBorder”和“toggleButton”-它找到了它们,但没有效果。你在win8中尝试过吗?它对我不起作用。(边框为null)我还检查了\u childNames私有数组并尝试了“DropDownBorder”和“toggleButton”-它找到了它们,但没有效果。