Combobox.Backgroundを変更する方法は?Windows8
ComboBox.Background=Brushes.Red
はComboBoxに影響を与えないため
1778 次
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 に答える