嵌套资源字典

时间:2012-02-23 05:36:24

标签: wpf styling resourcedictionary

我想为我的应用程序定义多个主题并在每次我喜欢的时候切换它们,但是我想将每个主题的每个控件的样式放在一个单独的ResourceDictionary中,这样它就能使文件成为一种商务风格而且我可以快速轻松地管理它们。 但问题是:嵌套的资源字典的样式不适用。 有什么建议吗? 谢谢。

2 个答案:

答案 0 :(得分:2)

我假设你为每个控件使用单独的资源字典,并为其他主题重复它。 所以我建议你为每个主题保留一个资源字典,例如:Theme1.xaml ..并合并所有属于这个主题的资源字典。 例如:

  <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
>
<ResourceDictionary.MergedDictionaries>
    <ResourceDictionary Source="pack://application:,,,/UrProject;component/Themes/Theme1/Button.xaml"/>
    <ResourceDictionary Source="pack://application:,,,/UrProject;component/Themes/Theme1/Combobox.xaml" />
    <ResourceDictionary Source="pack://application:,,,/UrProject;component/Themes/Theme1/ListBox.xaml" />
    <ResourceDictionary Source="pack://application:,,,/UrProject;component/Themes/Theme1/Checkbox.xaml" />
</ResourceDictionary.MergedDictionaries>

您可以在应用程序中添加和删除此资源字典,以便切换主题。希望能帮助到你。 :)

答案 1 :(得分:0)

您可以像这样将主题应用于您的应用程序..

    public static void ApplyTheme(string themeName)
    {
        if (string.IsNullOrEmpty(themeName) == false)
        {
            bool exist = false;
            string themeFileName =
                string.Format("/UrProject;component/Styles/{0}{1}", themeName, ".xaml");
            theme.Source = new Uri(themeFileName, UriKind.RelativeOrAbsolute);
            foreach (ResourceDictionary dictionary in Application.Current.Resources.MergedDictionaries)
            {
                if (string.Equals(dictionary.Source, themeFileName))
                {
                    exist = true;
                    break;
                }
            }
            if (exist == false)
            {
                Application.Current.Resources.MergedDictionaries.Add(theme);
            }

        }
    }