いきなりこのタイトルをつけておいて何ですが、その1ではコントロールの作り方については一切触れません!!
ただ、どういう時にWPFでコントロールを自作するのかという部分について書いて見ます。それを踏まえて、その2からコントロール作りにいそしんでいきます。
WPFでは、WindowsFormに比べて自作のコントロールを作ることは少なくなっています。WindowsFormの環境で自作コントロールを作るというのには、大きくわけて3つの動機があると思います。(他にもあるかな)
- 動作は同じなんだけど、見た目を変えたい!!
(画像つきボタンや、丸いボタン等) - 見た目の他に、コントロールに独自の動きを付け加えたい
(Silverlight3とかで追加される予定のDomainUpDownとか) - 複数のコントロールが連動して1つの目的を達成するコントロールを作りたい
おそらくWindowsFormで独自のコントロールを作るという動機は1が多かったのではないかと、個人的に思ています。
(状況によっては2が多い人とかもいると思います)
3は、ユーザーコントロールが適しているのかな。
WPFでは、1のようなニーズはTemplateの差し替えで済んでしまうため、通常はカスタムコントロールを作るのではなく、Styleを定義して、そこでTemplateを定義します。
後は、コントロールのStyle属性に適用してしまえば、見た目はごそっと入れ替わります。下のXAMLは、そういう場合の例を示しています。(うっただけで動かしてないので何処かに間違いはあるかもしれませんが、大体イメージはつかんでいただけると思います)
<!-- 三角形のボタンのスタイル -->
<Style x:Key="triangleButtonStyle" TargetType="{x:Type Button}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<!-- ここに三角形のボタンの見た目を定義する -->
</ControlTemplate>
<Setter.Value>
</Setter>
</Style>
<!-- 実際にボタンを定義する場所では以下のようにStyleを適用するだけ -->
<Button Content="ほげ" Style="{StaticResource triangleButtonStyle}" />
さらに、上のXAMLでStyleのx;Key属性を省略すると、Button全てに自動的に適用されるので、アプリケーション全体で三角形のボタンを使いたいという場合に、とても便利になります。
3については、引き続きユーザコントロールがWPFにもあるので、それで作るのが一番簡単でしょう。
ということで残る2ですが、この時には自分でコントロールを作るという選択になります。
ユーザーコントロールでも2の要件は普通に出来てしまうのが悲しい所ですが、Templateのサポートとか普通のWPFのコントロールでサポートされている機能を作りこむことは出来ません。
そういった点では、3の場合でも自分でコントロールを作るという選択肢を選択するのもありです。
ということで簡単にまとめると…
- 見た目とかを変える場合はTemplateの差し替えでOK
- 複数のコントロールが組み合わさったコントロールを作るときはユーザコントロールで
- Templateのサポートとか普通のWPFっぽいコントロールに仕上げたい場合はカスタムコントロールで
ということになります。
何が言いたいかというと、最初にも書きましたが、WPFだとWindowsFormの時よりカスタムコントロール作る機会が少ないよということです。
カスタムコントロールを作らないと!!って思ったら、もっと簡単な選択肢が使えないかということを考えてみるのも大事です。