wpf 在运行时更改主题

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/6229724/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-08 22:53:56  来源:igfitidea点击:

Change theme at runtime

wpf

提问by Entity

I have a WPF application with a theme (ShinyRed.xaml) and I want to have a button that when clicked changes the theme to ShinyBlue.xaml

我有一个带有主题 (ShinyRed.xaml) 的 WPF 应用程序,我想要一个按钮,单击时将主题更改为 ShinyBlue.xaml

I load in the theme initially in App.xaml:

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

<Application.Resources>
    <ResourceDictionary Source="/Themes/ShinyBlue.xaml"/>
</Application.Resources>

How might I do this?

我该怎么做?

采纳答案by IAmTimCorey

Here is an article that will walk you through it:

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

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

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

Basically you need to remove the "old" theme from the resource dictionary and then merge in the new one. The above article shows you how to make this change very simple.

基本上,您需要从资源字典中删除“旧”主题,然后合并到新主题中。上面的文章向您展示了如何使此更改变得非常简单。

回答by H.B.

How you coulddo it:

怎么做:

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary x:Name="ThemeDictionary">
                <ResourceDictionary.MergedDictionaries>
                    <ResourceDictionary Source="/Themes/ShinyRed.xaml"/>
                </ResourceDictionary.MergedDictionaries>
            </ResourceDictionary>
        </ResourceDictionary.MergedDictionaries>
    <!-- ... -->
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 });
    }

    //...
}

In your change method:

在您的更改方法中:

var app = (App)Application.Current;
app.ChangeTheme(new Uri("New Uri here"));

回答by ShadowKras

Im using the following command to set the theme at runtime:

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

Application.Current.Resources.Source = new Uri("/Themes/ShinyRed.xaml", UriKind.RelativeOrAbsolute);

回答by Thanh Bao

App.xaml

应用程序.xaml

    <Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="Themes/Font.xaml" />
            <ResourceDictionary Source="Themes/Light.xaml" />
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>

In your code:

在您的代码中:

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

you can check with this to be sure nothing grow

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

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

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

回答by Brock Hensley

H.B.'s answer did not run for me, I had to do this (works, tested):

HB 的回答不适合我,我必须这样做(有效,经过测试):

Uri dictUri = new Uri(@"/Resources/Themes/MyTheme.xaml", UriKind.Relative);
ResourceDictionary resourceDict = Application.LoadComponent(dictUri) as ResourceDictionary;
Application.Current.Resources.MergedDictionaries.Clear();
Application.Current.Resources.MergedDictionaries.Add(resourceDict);

To pretty it up:

美化它:

// Place in App.xaml.cs
public void ChangeTheme(Uri uri)
{
    ResourceDictionary resourceDict = Application.LoadComponent(uri) as ResourceDictionary;
    Application.Current.Resources.MergedDictionaries.Clear();
    Application.Current.Resources.MergedDictionaries.Add(resourceDict);
}

// Example Usage (anywhere in app)
private void ThemeRed_Click(object sender, RoutedEventArgs e)
{
    var app = App.Current as App;
    app.ChangeTheme(new Uri(@"/Resources/Themes/RedTheme.xaml", UriKind.Relative));      
}