スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: スポンサー広告

依存関係プロパティに適用される優先順位(基本値)

依存関係プロパティにおける値決定プロセスのSTEP1、基本値について試してみる。
依存関係プロパティは、色々な所からその値を設定できる。値を提供する箇所を「プロバイダ」なんて呼ぶっぽいけど。
大体は、StyleやTemplateやテーマ(Theme)だったりする。
以下のサイト参考
依存関係プロパティ値の優先順位
直訳ではないけど、時々わかりにくいので、原文も
Dependency Property Value Precedence
既出だけど、もう一回載せておく。
Dependency Properties
それによると、基本値決定の優先順位は、

1.ローカル値(Local Value)
2.TemplatedParent テンプレートのTrigger(Parent Template Trigger)
3.TemplatedParent テンプレート(Parent Template)
4.スタイルのトリガー(Style Triggers)
5.テンプレートのトリガー(Template Triggers)
6.スタイルの setter(Style Setters)
7.既定の(テーマ)スタイルトリガー(Default (Theme) Style Triggers)
8.既定の(テーマ)のスタイル(Default (Theme) Style Setters)
9.包含継承(Property Value Inheritance)
10.デフォルト値(Default Value)

となる。
上になるほど、優先順位は高い。
上の順序で適用可能な値を検索し、発見した時点で検索を止めるんだろう。
だから、ローカル値(1)に設定すると、Style Trigger(5)に反応しない。
包含継承(9)って意外に低いな。デフォルト値(10)は最後の砦ってやつか?
というわけで、値の適用順序確認という事で以下のようなXAMLを記述してみた。

<Window.Resources>
<!--スタイル1-->
<Style TargetType="Button">
<Setter Property="Background" Value="BlanchedAlmond"/>
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="Brown"/>
<Setter Property="FontWeight" Value="Bold"/>
<Setter Property="FontStyle" Value="Italic"/>
</Trigger>
</Style.Triggers>
</Style>
<!--スタイル2-->
<Style x:Key="ExplicitButtonStyle" TargetType="Button">
<Setter Property="Background" Value="DarkViolet"/>
<Setter Property="FontStyle" Value="Italic"/>
</Style>
</Window.Resources>
<StackPanel HorizontalAlignment="Left" TextElement.FontStyle="Italic">
<Button Content="Button1" Background="Azure"/>
<Button Content="Button2" FontWeight="Light" FontStyle="Normal"/>
<Button Content="Button3" Style="{StaticResource ExplicitButtonStyle}"/>
<Button Content="Button4"/>
</StackPanel>

・Button1のBackgroundプロパティは、ローカル値(1)である「Azure」が設定される。
 スタイル1で設定された「BlanchedAlmond」(6)は適用されない。
・Button2のBackgroundプロパティは、スタイル1によって、「BlanchedAlmond」が設定される。(6)
 ただし、Style Triggerの条件を満たせば、「Brown」に変わる(4)。
・Button3のBackgroundプロパティは、明示的に指定したスタイル(ExplicitButtonStyle)の「DarkViolet」が設定される。(6)
・Button4のBackgroundプロパティは、スタイル1によって、「BlanchedAlmond」が設定される。(6)
 ただし、Style Triggerの条件を満たせば、「Brown」に変わる。(4)

・Button1とButton4のFontStyleプロパティは、StackPanelに設定されたTextElement.FontStyleの値が設定されている(9)。
・Button2のFontStyleプロパティには、ローカル値「Normal」(1)が設定される
・Button3は、明示的スタイル内の「Italic」が設定される。(6)

・Button1とButton4の上にマウスカーソルが来た時、FontWeightプロパティは、「Bold」が設定される。(4)
 Button2は、ローカル値に「Light」が設定されているため(1)、Style Triggerには反応しない。
 Button3は、明示的にスタイルが指定されているので、Style Triggerには反応しない。

Styleプロパティだけは、3と4の間に「暗黙のスタイル」という項目が入る。
要素の種類に一致するスタイルリソースを検索する(テーマ内は検索されない)。
スタイル1は、キーを指定していないので、Button3のように明示的にリソースを指定しないButtonに適用される。

この基本値の決定を踏まえて、さらにDataBindingやアニメーション、値の強制等を通って、最終的な値が決められる。
このあたりを理解していない(頭の片隅にもない)と、Styleであったり、Temlate(DataTemplateやControlTemplate)を使う際に、
値が期待通りにならない(@w@;
とか、
設定した筈のトリガーに反応しない(@w@;
とか悩んでしまうことになる。
わからないからって、このあたりをすっ飛ばすと、簡単な実装はできても、複雑な実装をする時にハマるんだなぁ。
まあ、ハマってから調査した方が、自分の知識になりやすいんだけどね。
スポンサーサイト
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: WPF4 | コメント: 0 | トラックバック: 0


この記事へのコメント

コメントの投稿

非公開コメント


サイドバー背後固定表示サンプル

当ブログに書かれたソースコードは流用自由です。

バグ、スペルミス等はありうる事です。

ご利用の際は自己責任でお願いしますm(_ _)m

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