0

Combobox.Backgroundを変更する方法は?Windows8 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 に答える