15

アプリケーションに複数の があるため、それぞれWindowに を設定する必要のないソリューションを探しています。bindingWindow

ウィンドウの背景用のResourceDictionaryを作成しました:style

<Style TargetType="{x:Type Window}">
    <Setter Property="Background" Value="AliceBlue"/>
</Style>

私のXAML中で、私は次のように設定しましたResourceDictionary

<Window.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="Templates.xaml" />
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Window.Resources>

エラーはありませんが、私のWindow色は白のままです。

4

3 に答える 3

32

これは、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がこのように機能しないことを意味します。残念ながら、手動バインディングは常に必要です。

于 2013-03-15T10:07:09.307 に答える
3

これは、アプリケーションで使用したソリューションです。これにより、すべてのウィンドウ スタイルをまとめることができ、セクションの後に数行を追加するだけで済み<Window.Resources>ます。

好きなことをしてくださいStyle

<Style x:Key="MyWindowStyle">
    <Setter Property="Window.Background" Value="AliceBlue"/>
</Style>

次に、ウィンドウに</Window.Resources>次を含めます。

<Window.Style>
    <Style BasedOn="{StaticResource MyWindowStyle}"/>
</Window.Style>
于 2014-02-11T16:59:13.263 に答える
0

リソース ディクショナリに新しいブラシを追加する

<SolidColorBrush x:Key="WindowBackground" Color="AliceBlue" />

WPFウィンドウで、必要なリソースをウィンドウの背景プロパティに設定するだけです

<Window x:Class="GDD.Presentation.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="300" Width="300"
    Background="{StaticResource WindowBackground}">
于 2013-03-15T09:25:26.570 に答える