Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在WPF中更改主题,主题不更改_C#_Wpf - Fatal编程技术网

C# 在WPF中更改主题,主题不更改

C# 在WPF中更改主题,主题不更改,c#,wpf,C#,Wpf,这只是POC的草稿 The Dictionary hierarchy is; Colors Brushes Styles So the ordering is important 我试图改变WPF中的主题,我可以这样做 + private void ChangeTheme(string themeName) + { + ResourceDictionary resource = null; + using (

这只是POC的草稿

The Dictionary hierarchy is;
  Colors
  Brushes
  Styles

So the ordering is important
我试图改变WPF中的主题,我可以这样做

+        private void ChangeTheme(string themeName)
+        {
+            ResourceDictionary resource = null;
+            using (FileStream fs = new FileStream("../../../Resources/ResourceDictionaries/" + themeName + ".xaml", FileMode.Open, FileAccess.Read))
+                resource = (ResourceDictionary)XamlReader.Load(fs);
+
+            Application.Current.Resources.MergedDictionaries.Clear();
+            Application.Current.Resources.MergedDictionaries.Add(new ResourceDictionary()
+            { Source = new Uri("pack://application:,,,/Resources/ResourceDictionaries/dictionary1.xaml") });
+            Application.Current.Resources.MergedDictionaries.Add(resource);
+            Application.Current.Resources.MergedDictionaries.Add(new ResourceDictionary()
+            { Source = new Uri("pack://application:,,,/Resources/ResourceDictionaries/Monotone.Brushes.xaml") });
+            Application.Current.Resources.MergedDictionaries.Add(new ResourceDictionary()
+            { Source = new Uri("pack://application:,,,/Resources/ResourceDictionaries/Monotone.xaml") });
+        }
但是,如果我向项目中添加更多ResourceDictionary,我将不得不回到这里并修改列表

所以我想我会这样做,但它似乎不起作用。主题不变!加载新主题,将旧词典转移到dictionaryCollection,并将所有内容添加回Application.Current.Resources.MergedDictionariy,但不显示新主题

我在谷歌上搜索了几个小时,我找到的所有东西都说这应该行得通

private void ChangeTheme(string themeName)
{
    ResourceDictionary resource = null;
    string file = "../../../Resources/ResourceDictionaries/" + themeName + ".xaml";
    //using (FileStream fs = new FileStream(file, FileMode.Open, FileAccess.Read))
    //    resource = (ResourceDictionary)XamlReader.Load(fs);

    resource = new ResourceDictionary();
    resource.Source = new Uri(file, UriKind.Relative);

    ResourceDictionary rd = GetActualResourceDictionary();
    if (rd != null)
        Application.Current.Resources.MergedDictionaries.Remove(rd);

    // Create collection to hold old RecourceDictionaries
    System.Collections.ObjectModel.Collection<ResourceDictionary> dictionaryCollection = new
        System.Collections.ObjectModel.Collection<ResourceDictionary>();

    // Copy REsourceDictionaries left after removing the Theme
    foreach (ResourceDictionary dict in Application.Current.Resources.MergedDictionaries)
        dictionaryCollection.Add(dict);

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

    foreach (ResourceDictionary dict in dictionaryCollection)
        Application.Current.Resources.MergedDictionaries.Add(dict);
}

//NOTE This works but the
static ResourceDictionary GetActualResourceDictionary()
{
    // get the actual ResourceDictionary
    foreach (ResourceDictionary res in Application.Current.Resources.MergedDictionaries)
    {
        if (res.Source != null)
        {
            string source = res.Source.ToString();
            if (source.ToUpper().Contains("THEME"))
                return res;
        }
    }
    return null;
}
private void ChangeTheme(字符串themeName)
{
ResourceDictionary资源=null;
字符串文件=“../../../Resources/ResourceDictionaries/”+themeName+“.xaml”;
//使用(FileStream fs=newfilestream(file,FileMode.Open,FileAccess.Read))
//resource=(ResourceDictionary)XamlReader.Load(fs);
resource=新的ResourceDictionary();
resource.Source=新Uri(文件,UriKind.Relative);
ResourceDictionary rd=GetActualResourceDictionary();
如果(rd!=null)
Application.Current.Resources.MergedDictionaries.Remove(rd);
//创建集合以保存旧的资源字典
System.Collections.ObjectModel.Collection dictionaryCollection=新建
System.Collections.ObjectModel.Collection();
//复制删除主题后留下的ResourceDictionary
foreach(Application.Current.Resources.MergedDictionaries中的ResourceDictionary dict)
dictionaryCollection.Add(dict);
Application.Current.Resources.MergedDictionaries.Clear();
Application.Current.Resources.MergedDictionaries.Add(资源);
foreach(字典集合中的ResourceDictionary dict)
Application.Current.Resources.MergedDictionaries.Add(dict);
}
//请注意,这是可行的,但是
静态资源字典GetActualResourceDictionary()
{
//获取实际的资源字典
foreach(Application.Current.Resources.MergedDictionaries中的ResourceDictionary res)
{
如果(res.Source!=null)
{
string source=res.source.ToString();
if(source.ToUpper()包含(“主题”))
返回res;
}
}
返回null;
}

我在这里的示例中遗漏了一件重要的事情;如何在XAML中实际使用我的样式。一个主题只有在它是DynamicResource时才能更改资源,因此任何StaticResource条目都将保持其原始样式,而不管我对资源字典做了什么