TextBlockのデフォルトスタイルを定義してはならない

WPFではTextBlockのデフォルトスタイルを定義してはならない。
デフォルトスタイルとは例えば次のようにリソースキーを指定せずに既定のスタイルを定義するもの。

いつもなら,こうしたスタイルを定義しておけば,開発しているアプリ内でスタイルが統一しやすくなって効率がよい。
でもTextBlockの場合は事情が異なる。

例えば,さっきのTextBlockのデフォルトスタイルを定義した上で,Buttonのスタイルを次のように定義するとしよう。

このとき,次のようにボタンにスタイルを適用する。

すると,ボタンの文字の色は赤でも青でもなく,白になる。
ボタンのスタイルでも,ボタンのプロパティに直接指定した色でもなく,TextBlockのデフォルトスタイルが優先される。(衝撃)
自分ではボタンの文字を青で表示するつもりでButtonのForegroundプロパティにBlueを指定していても,それが無視されるのだ。

WPFではボタンなどのコントロールのContentプロパティに文字列を指定した場合,内部でTextBlock要素を生成し,それを画面に表示する仕組みになっている。
Visual Studioでデバッグしているときに使えるライブツリービュー機能で見てみると分かる。

ここで,こうした内部的なTextBlock要素には,その親要素に当たるコントロールに対して直接スタイル指定を行っても,TextBlockのデフォルトスタイルの方が優先して適用されてしまうという特徴がある。

すべての文字のスタイルを統一する場合や,フォントファミリーとか一部分だけ統一する場合にTextBlockのデフォルトスタイルは有効かも。
でも,他のコントロールと同様に扱うと後々痛い目見そう。

コメントする