質問: ### 前提・実現したいこと NumericUpDownコントロールを作成しています。 このNumericUpDownコントロールはテキストボックス、UpボタンとDownボタンで構成されます。 Templateに対応させるためにカスタムコントロールで作成しています。 ネットで検索したところ、いくつかのサンプルがあったので参照したところ、 UpボタンとDownボタンはオーバーライドしたOnApplyTemplate()メソッド内で GetTemplateChildメソッドでターゲットコントロール(ボタン)を取得して クリックイベントの関連付けを行っていました。 今回この部分を以下のような動きに変更したいです。 テキストボックスにフォーカスが当たった時にUpボタンとDownボタンをVisualTreeに登録して それぞれクリックイベントの関連付けを行い、 フォーカスが外れたらUpボタンとDownボタンをVisualTreeから削除するようにしたいです。 (※visibilityによる表示/非表示による制御ではなく) これに関して2点質問があります。 **1UpボタンとDownボタンを生成方法** 条件によってコントロールを切り替えたいときに、 今まではxamlのStyleのTrggerを使用してContentControlのContentTemplateを切り替えるようにしていましたが、 今回もこのような方法でよいのでしょうか? 逆にどのような方法を取るのがベストプラクティスなのでしょうか? (コードビハインドからVisualTreeへ直接登録する方法は除きます。) **2クリックイベントの関連付け** 1でContentControlでContentTemplateが切り替えた時に UpボタンとDownボタンのクリックイベントの関連付けをどのように行えばよいのでしょうか? (GetTemplateChildメソッドはVisualTreeに存在するものしか取得できないので OnApplyTemplate()メソッドではイベントの関連付けが行えない) ### 補足情報(言語/FW/ツール等のバージョンなど) VisualStudio2015 Community(VB/C#) .net Freamwork4.6.2
回答: カスタムコントロールのベストプラクティスとしては「Parts and States モデル」が有名なのではと思います。 ネットで検索されているということでご覧になられてるかもですが、MSDN の以下の記事で NumericUpDown を例にこのモデルの考え方が解説されていました。 * 今回の前提の見た目の動作だけ上の例に当てはめるのであれば、Focused と Unfocused の VisualState で Up ボタンと Down ボタンの Visibility を変更する Storyboard を定義するだけで解決しますが、VisualTree への登録や削除が必要となると少しが厄介ですね。 ちょっと長くなりましたが、質問への回答は以下になります。 > > 1UpボタンとDownボタンを生成方法 > > > ちょっとしたコントロールのプロパティ変更なら Trigger を用いたりしますが、コントロールの生成/破棄を行うようなものは C# コードに書くことがほとんどです。 特にコントロールへのイベント登録が必要な場合は、イベント解除もしっかり行わないとメモリリークの原因になるため、C# コードで頑張って書いてます。 > > 2クリックイベントの関連付け > > > ボタンのある DataTemplate とボタンのない DataTemplate を用意して切り替える場合、Template 変更後に ApplyTemplate メソッドを呼び出すことで GetTemplateChild メソッドでボタンを取得できるようになるのではと思います。