これは、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 スタイルと一致する既定値があることに注意してください。ResourceDictionaryx:Key="{x:Type Window}"
myStyleこれは、明示的に使用すると裏付けられます。Window属性を定義に追加するStyle="{StaticResource myStyle}"と、デザイナーが失敗することがわかりますがmyStyle、ウィンドウが必要とするときに作成されていないため、実行時エラーも発生します。に切り替えると、が解析されてスタイルが含まれると更新されるStyle="{DynamicResource myStyle}"ため、期待どおりに機能することがわかります。DynamicResourceResourceDictionary
したがって、これを適用すると、これを 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がこのように機能しないことを意味します。残念ながら、手動バインディングは常に必要です。