気楽なソフト工房

プログラミングについていろいろな記事を書いています。



mykonos2008

Author:mykonos2008
システムエンジニアとして働いている30代の会社員です。
仕事や趣味でプログラムを書いている方の役に立つ記事を書いていきたいと思っています。
ご意見、ご感想はこちらまで
If you are an english speaker,Please visit my english blog.

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
WPFのComboBoxでは「TextChanged」イベントが提供されていません。これが結構不便な時があります。
TextInputイベントだと「Backspace」や「Space」が拾われません。KeyDownイベントだと、
拾えるのですが、自分でTextに対して処理をしなければいけません。これは面倒くさいです。

そこでComboBox内のTextBoxにアクセスするためのテクニックをご紹介します。

まず、ComboBoxを拡張したカスタムコントロールを作成します。コントロールのスタイルに関しては
ComboBoxのものをそのまま使いたいので、以下のようにします。

   static ConditionComboBox()
   {
       //ComboBoxの見栄えを採用する
       DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomComboBox), 
              new FrameworkPropertyMetadata(typeof(ComboBox)));
   }

最初はGeneric.xamlに定義するカスタムコントロール用のスタイルを使用するように指定されているのですが、
これをComboBoxのスタイルを使用するように変更します。(黄色字の部分)

次にOnRenderメソッドをオーバーライドして次のように記述します。

   protected override void OnRender(System.Windows.Media.DrawingContext drawingContext)
   {
       base.OnRender(drawingContext);

       //ComboBox内のTextBoxを取得する
       TextBox textBox = this.GetTemplateChild("PART_EditableTextBox") as TextBox;

       //TextChangedイベントにハンドラを登録する
       textBox.TextChanged += new TextChangedEventHandler(textBox_TextChanged);
   }

この方法は、TextBoxに直接アクセスできるので、TextChangedイベントを処理する他に、
TextBoxの挙動を変えたい場合などにも使えます。

コメント

コメントの投稿

管理者にだけ表示を許可する

トラックバック

http://csfun.blog49.fc2.com/tb.php/92-900eb9d5

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。