2016-03-23 148 views
1

コードを使用して、実行時にComboBoxの背景色を動的に変更しようとしています。特に、ComboBoxの一部である編集可能なTextBoxの背景を変更したいと思います。WPF編集可能なComboBoxの背景色をプログラムで変更する

は、このように、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

これはあなたがXAMLだけファンのためにそれを再利用可能なAttachedPropertyソリューションを

<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

を行うことができる方法です。

<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

関連する問題