C# 在WPF中更改主题,主题不更改
这只是POC的草稿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 (
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条目都将保持其原始样式,而不管我对资源字典做了什么