10

私のプロジェクトでは、プロジェクト全体のすべての WPF ウィンドウに ProjectTheme.xaml ファイルを使用しています。ProjectTheme.xaml ファイルは、次のようにスタイル テーマを参照します。

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <ResourceDictionary.MergedDictionaries>
        <!-- In order to modify the project's theme, change this line -->
        <ResourceDictionary Source="/MyProject;component/Themes/WPFThemes/Customized.xaml" />
    </ResourceDictionary.MergedDictionaries>
</ResourceDictionary>

すべての WPF ウィンドウは WindowBase.xaml を参照します

<Window.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="/MyProject;component/View/WindowBase.xaml"/>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Window.Resources>

WindowBase.xaml は、カスタマイズされたタイトルバー Bar1.xaml を参照します

<ResourceDictionary.MergedDictionaries>
    <ResourceDictionary Source="/MyProject;component/Themes/WPFThemes/Bar1.xaml" />
</ResourceDictionary.MergedDictionaries>

Bar1.xaml は ProjectTheme.xaml を参照します

<ResourceDictionary.MergedDictionaries>
    <ResourceDictionary Source="/MyProject;component/ProjectTheme.xaml"/>
</ResourceDictionary.MergedDictionaries>

したがって、ヒエラルキーは

  • Window1 は WindowBase.xaml を参照します
  • WindowBase は Bar1.xaml を参照します
  • Bar1 は ProjectTheme.xaml を参照します
  • ProjectTheme.xaml は、実際のテーマ リソース ファイルを参照します。

これはうまくいきます。アプリを終了せずに、実行時にプロジェクトのテーマを動的に変更したいと考えています。いくつかのテーマ スタイル ファイルがあるとします。

  • カスタマイズされた.xaml
  • カスタマイズされた1.xaml
  • Customized2.xaml

私の質問は、実行時に ProjectTheme.xaml ファイルを動的に更新して行を変更できるかどうかです。

<ResourceDictionary Source="/MyProject;component/Themes/WPFThemes/Customized.xaml" />

<ResourceDictionary Source="/MyProject;component/Themes/WPFThemes/Customized1.xaml" />

私の目的を達成するには?はいの場合、どうすればよいですか?いいえの場合、その理由と、目的を達成するための最善の (他の) 方法は何ですか?

次のことを試しましたが、どれも機能しません: スタイルは変わりません。

方法1

Application.Current.Resources.MergedDictionaries.Clear();
Uri NewTheme = new Uri(@"/MyProject;component/Themes/WPFThemes/Customized2.xaml", UriKind.Relative);
ResourceDictionary dictionary = (ResourceDictionary)Application.LoadComponent(NewTheme);
Application.Current.Resources.MergedDictionaries.Add(dictionary);

方法 2

Application.Current.Resources.MergedDictionaries.RemoveAt(0);
Uri NewTheme = new Uri(@"/MyProject;component/Themes/WPFThemes/Customized2.xaml", UriKind.Relative);
ResourceDictionary dictionary = (ResourceDictionary)Application.LoadComponent(NewTheme);
Application.Current.Resources.MergedDictionaries.Insert(0, dictionary);

注: 実際のテーマ スタイル ファイル (Customized.xaml...) では、動的リソースと静的リソースを組み合わせて使用​​しました。それは重要ですか?

前もって感謝します。

4

1 に答える 1