しばやん雑記

ASP.NET とメイドさんが大好きなフリーランスのプログラマーのブログ

スタイルとデフォルトスタイル

前にもこんなタイトルの記事を書いた気もしますが気にしない方向で。
ここで言うスタイルは x:Key を付けた Style とし、デフォルトスタイルは x:Key を付けずに TargetType で型だけを指定したものとします。この両者を混在して書いた場合に。どのようにスタイルが適用されるか整理するために調べてみました。
結果は以下の通り。

  • スタイルに BasedOn でデフォルトスタイルを指定した場合
    • デフォルトスタイル + スタイル
  • スタイルに BaseOn を指定しなかった場合
    • スタイルのみ
  • UI 要素で Style を指定しなかった場合
    • デフォルトスタイルのみ

まあ、当たり前といえば当たり前の結果です。もともと存在するスタイルを継承したい時には BasedOn に StaticResource で指定してやるだけです。2 つ以上のスタイルを適用したい場合*1は BasedOn を使って合成したスタイルを作ることで実現できます。
ちなみに BasedOn でデフォルトスタイルを指定するときには

<Style x:Key="RoundButton" TargetType="{x:Type Button}" BasedOn="{StaticResource {x:Type Button}}">
    <!-- 省略 -->
</Style>

のように書きます。マークアップ拡張の入れ子って個人的には見た目が気持ち悪いです。
スタイルとは関係ないですが、MenuItem など一部のコントロールにはデフォルトスタイルを使うのではなく、ControlTemplate に x:Key を付けてテンプレートを入れ替えるものが存在します。*2
この場合はスタイルと共存できるので、わざわざ Setter で Template を書き換えたり、BasedOn を使わなくても問題ないです。

*1:デフォルトスタイル + テーマといったような感じ。

*2:Blend や Windows SDK に付属のテーマを見るとわかりやすい。