簡體   English   中英

在Windows 8中更改ComboBox背景顏色

[英]Change ComboBox background color in Windows 8

如何更改Combobox.Background? 由於Windows 8 ComboBox.Background=Brushes.Red對ComboBox沒有影響

我偶然遇到了同樣的問題,這把我帶到這里。

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是否曾嘗試解決相關問題並修改模板,該檢查就會失敗,並且很可能會失敗。 。

我知道已經晚了,但是我找到了解決它的方法。 只需使用更正后的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);
                }
            }
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM