在运行时更改主题

Ent*_*ity 24 wpf

我有一个带主题的WPF应用程序(ShinyRed.xaml),我希望有一个按钮,点击后将主题更改为ShinyBlue.xaml

我最初在App.xaml中加载主题:

<Application.Resources>
    <ResourceDictionary Source="/Themes/ShinyBlue.xaml"/>
</Application.Resources>
Run Code Online (Sandbox Code Playgroud)

我怎么能这样做?

H.B*_*.B. 33

怎么做的:

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary x:Name="ThemeDictionary">
                <ResourceDictionary.MergedDictionaries>
                    <ResourceDictionary Source="/Themes/ShinyRed.xaml"/>
                </ResourceDictionary.MergedDictionaries>
            </ResourceDictionary>
        </ResourceDictionary.MergedDictionaries>
    <!-- ... -->
Run Code Online (Sandbox Code Playgroud)
public partial class App : Application
{
    public ResourceDictionary ThemeDictionary
    {
        // You could probably get it via its name with some query logic as well.
        get { return Resources.MergedDictionaries[0]; }
    }

    public void ChangeTheme(Uri uri)
    {
        ThemeDictionary.MergedDictionaries.Clear();
        ThemeDictionary.MergedDictionaries.Add(new ResourceDictionary() { Source = uri });
    }

    //...
}
Run Code Online (Sandbox Code Playgroud)

在您的更改方法中:

var app = (App)Application.Current;
app.ChangeTheme(new Uri("New Uri here"));
Run Code Online (Sandbox Code Playgroud)


IAm*_*rey 6

这篇文章将引导您完成它:

http://svetoslavsavov.blogspot.com/2009/07/switching-wpf-interface-themes-at.html

基本上你需要从资源字典中删除"旧"主题,然后合并到新的主题.上面的文章向您展示了如何使这一变化变得非常简单.


Sha*_*ras 6

我使用以下命令在运行时设置主题:

Application.Current.Resources.Source = new Uri("/Themes/ShinyRed.xaml", UriKind.RelativeOrAbsolute);
Run Code Online (Sandbox Code Playgroud)


Tha*_*Bao 5

应用程序.xaml

    <Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="Themes/Font.xaml" />
            <ResourceDictionary Source="Themes/Light.xaml" />
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>
Run Code Online (Sandbox Code Playgroud)

在您的代码中:

> Application.Current.Resources.MergedDictionaries[1].Source = new Uri("Themes/Dark.xaml", UriKind.RelativeOrAbsolute);
Run Code Online (Sandbox Code Playgroud)

你可以检查这个以确保没有任何增长

Application.Current.Resources.MergedDictionaries.Count.ToString();