0

我将使用 WPF 在 .net 中开发一个 Windows 应用程序。那么,我们如何在运行时实现动态主题。我已经对此进行了很多搜索,但我无法理解这件事。如果我在 app.xaml 中添加以下行,则会显示错误,因为我们如何可以直接添加事物行。虽然不存在名为“ExpressionDark”的文件。

<ResourceDictionary Source="Themes/ExpressionDark.xaml"/>
***or*** 
<ResourceDictionary Source="ExpressionDark.xaml"/>

提前致谢 :)

4

2 回答 2

0

您可以像这样在 App.Xaml 中合并主题:

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="defaulttheme.xaml" />
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>

defaulttheme.xaml 文件必须位于项目的根目录中。如果您想为主题构建自己的项目,您可以像这样合并资源:

  <ResourceDictionary Source="/MyThemeProject;component/defaulttheme.xaml" />       

这里的 defaulthteme.xaml 也必须位于根目录的 MyThemeProject 中,并且不要忘记从主项目添加对该项目的添加引用。

要构建结构,您可以根据需要添加文件夹。

<ResourceDictionary Source="/MyThemeProject;component/Folder1/Folder2/defaulttheme.xaml" />

要切换主题,请先清除 MergedDictionaries,然后添加新主题

NewTheme = new Uri(@"/MyThemeProject;component/folder1/Folder2/bluetheme.xaml", UriKind.Relative);

Application.Current.Resources.MergedDictionaries.Clear();
Application.Current.Resources.MergedDictionaries.Add(NewTheme); 

问候

吹嘘

于 2012-05-22T17:07:01.630 回答
0

假设DynamicThemes,您的意思是将主题放在运行时,这是加载资源字典的最佳方式,将控件样式充满到主应用程序或任何控件的资源中。

    public static ResourceDictionary GetThemeResourceDictionary(Uri theme)
    {
        if (theme != null)
        {
            return Application.LoadComponent(theme) as ResourceDictionary;
        }
        return null;
    }

    public static void ApplyTheme(this ContentControl control /* Change this to Application to use this function at app level */, string theme)
    {
        ResourceDictionary dictionary = GetThemeResourceDictionary(theme);

        if (dictionary != null)
        {
            // Be careful here, you'll need to implement some logic to prevent errors.
            control.Resources.MergedDictionaries.Clear();
            control.Resources.MergedDictionaries.Add(dictionary);
            // For app level
            // app.Resources.MergedDictionaries.Clear();
            // app.Resources.MergedDictionaries.Add(dictionary);

        }
    }
于 2012-05-23T06:58:52.780 回答