2016-03-23 6 views
1

Я пытаюсь динамически изменять цвет фона редактируемого ComboBox во время выполнения, используя код. В частности, я хочу изменить фон редактируемого TextBox, который является частью ComboBox.Изменять цвет фона редактируемого ComboBox WPF

Есть несколько ответов об этом на так, как этот:

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

Вы хотите изменить один ComboBox, или все редактируемые ComboBoxes? – 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

Упрощенный для аккуратной реализации –

+0

@Master_T Спасибо. Эта реализация также имеет то преимущество, что ее можно применять к стилю по умолчанию, без использования в каждом поле со списком. AttachedProperties - вот некоторые из действительно полезных функций WPF – Dbl

Смежные вопросы