これは、WPF がネストされた からスタイルをロード/処理する順序と、クラスResourceDictionary
の仕様の組み合わせによって引き起こされるようです。Window
MainWindow
あなたの投稿に従って定義されていると仮定します。次を に入れますTemplates.xaml
。
<Style TargetType="{x:Type Window}">
<Setter Property="Background" Value="Red"/>
</Style>
<Style TargetType="{x:Type Window}" x:Key="myStyle">
<Setter Property="Background" Value="Green"/>
</Style>
スタイルが定義されていない場合MainWindow
、デザイナーでは赤い背景で表示されます。デザイナーは、Xaml 全体を解析してリソース ディクショナリを読み込み、結果を描画します。ウィンドウが描画される前にスタイルが読み込まれるため、赤い背景が適用されます。
アプリケーションを実行すると、ResourceDictionary
が適用される前にウィンドウが作成されます。ネストされたものが処理される前に、デフォルトのスタイル ( を含むスタイルx:Key="{x:Type Window}"
)を探しますが、何も見つかりません。したがって、実行時に、ウィンドウはデフォルトの色で表示されます。(これは、上記のコメントで説明されている動作です。) スタイル withには、Windows スタイルと一致する既定値があることに注意してください。ResourceDictionary
x:Key="{x:Type Window}"
myStyle
これは、明示的に使用すると裏付けられます。Window
属性を定義に追加するStyle="{StaticResource myStyle}"
と、デザイナーが失敗することがわかりますがmyStyle
、ウィンドウが必要とするときに作成されていないため、実行時エラーも発生します。に切り替えると、が解析されてスタイルが含まれると更新されるStyle="{DynamicResource myStyle}"
ため、期待どおりに機能することがわかります。DynamicResource
ResourceDictionary
したがって、これを適用すると、これを Window 要素に追加することで 1 つの方法で問題を解決できますStyle="{DynamicResource {x:Type Window}}"
。より良い解決策は、リソース ディクショナリをapp.xaml
ファイルに含めることです。このファイルでは、ウィンドウが開かれる前に解析され、すべてのユーザーが利用できるようになります。
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Templates.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
ここでの本当の問題は、 yourWindow
が実際には a ではないというWindow
ことです: それはから派生しWindow
、実際には , などになるMainWindow
クラスWindow2
です... これは、 a の自動スタイル ワイヤアップWindow
がこのように機能しないことを意味します。残念ながら、手動バインディングは常に必要です。