2016-03-23 106 views
1

我试图在运行时使用代码动态更改可编辑ComboBox的背景颜色。特别是,我想更改作为ComboBox的一部分的可编辑TextBox的背景。以编程方式更改WPF可编辑组合框的背景颜色

大约有这几个答案的SO,像这样的:

WPF change the background color of an edittable combobox in code

然而,问题是,它们都基于XAML和编辑默认模板。我不想这样做,我正在寻找一种只用代码工作的通用解决方案。

可能吗?我试过似乎很明显的解决方案:

TextBox textBox = (TextBox)comboBox.Template.FindName("PART_EditableTextBox", comboBox); 
textBox.Background = Brushes.Yellow; 

但是这绝对没有。我错过了什么?

+0

是否要改变单一的组合框,或所有可编辑的组合框? – wimh

+0

试一下:http://www.codeproject.com/Tips/84637/TIP-Change-background-of-WPF-Combobox –

+0

@Wimmel:一个人 –

回答

1

这是你如何能做到这

<ComboBox Loaded="MyCombo_OnLoaded" x:Name="myCombo" IsEditable="True"></ComboBox> 

private void MyCombo_OnLoaded(object sender, RoutedEventArgs e) 
{ 
     var textbox = (TextBox)myCombo.Template.FindName("PART_EditableTextBox", myCombo); 
     if (textbox!= null) 
     { 
      var parent = (Border)textbox.Parent; 
      parent.Background = Brushes.Yellow; 
     } 
} 
+0

工程像一个魅力,也超级简单。 –

2

可重复使用的AttachedProperty解决方案为XAML中的球迷:

<ComboBox Background="Orange" IsEditable="True" Text="hi" local:ComboBoxHelper.EditBackground="Red"></ComboBox> 

实现:

public static class ComboBoxHelper 
{ 
    public static readonly DependencyProperty EditBackgroundProperty = DependencyProperty.RegisterAttached(
     "EditBackground", typeof (Brush), typeof (ComboBoxHelper), new PropertyMetadata(default(Brush), EditBackgroundChanged)); 

    private static void EditBackgroundChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs args) 
    { 
     var combo = dependencyObject as ComboBox; 
     if (combo != null) 
     { 
      if (!combo.IsLoaded) 
      { 
       RoutedEventHandler comboOnLoaded = null; 
       comboOnLoaded = delegate(object sender, RoutedEventArgs eventArgs) 
       { 
        EditBackgroundChanged(dependencyObject, args); 
        combo.Loaded -= comboOnLoaded; 
       }; 
       combo.Loaded += comboOnLoaded; 

       return; 
      } 

      var part = combo.Template.FindName("PART_EditableTextBox", combo); 
      var tb = part as TextBox; 
      if (tb != null) 
      { 
       var parent = tb.Parent as Border; 
       if (parent != null) 
       { 
        parent.Background = (Brush)args.NewValue; 
       } 
      } 
     } 
    } 

    [AttachedPropertyBrowsableForType(typeof(ComboBox))] 
    public static void SetEditBackground(DependencyObject element, Brush value) 
    { 
     element.SetValue(EditBackgroundProperty, value); 
    } 

    [AttachedPropertyBrowsableForType(typeof(ComboBox))] 
    public static Brush GetEditBackground(DependencyObject element) 
    { 
     return (Brush) element.GetValue(EditBackgroundProperty); 
    } 
} 
+0

Upvoted整洁实施 –

+0

@Master_T谢谢。此实现还具有可以应用于默认样式的优点,而无需在每个组合框中摆弄。 AttachedProperties是WPF的一些非常有用的功能 – Dbl

相关问题