简而言之,我的问题是:如何在 WP7.1 应用程序中切换 ResourceDictionaries?有没有比我想做的更简单的方法?
细节...
在 Windows Phone 7 项目中,我需要根据用户的主题(浅色/深色)替换应用程序资源。简而言之,思路很明显:
a) 创建 ResourceDictionary 变量
b) 根据当前主题获取相应的样式和画笔资源文件
c) 将上述资源添加到 Application.Current.Resources.MergedDictionaries
这就是我正在做的事情:
1) “查看”项目中资源的文件夹结构:
Resources
Dark
Brushes.xaml
Styles.xaml
Light
Brushes.xaml
Styles.xaml
2) 2 个 Brushes.xaml 文件中的样式具有相同的 Keys。与 Styles.xaml 相同。
3)在我的第一次尝试中(假设选择了浅色主题),我在第二行得到一个“未指定的错误”。
var uriPath = "Resources/Light/Brushes.xaml";
var brushes = new ResourceDictionary {Source = new Uri(uriPath, UriKind.Relative)};
dic.MergedDictionaries.Add(brushes);
(仅供参考,我尝试使用资源、页面和内容构建操作)
4) 我的第二次尝试给了我希望,因为我成功地将 Brushes.xaml 填充到应用程序的 MergedDictionaries 中:
string xaml;
var uriPath = "Resources/Light/Brushes.xaml";
var brushesUri = new Uri(uriPath, UriKind.Relative);
var brushesStream = Application.GetResourceStream(brushesUri);
using (var brushesStreamReader = new StreamReader(brushesStream.Stream))
xaml = brushesStreamReader.ReadToEnd();
var dic = new ResourceDictionary();
dic.MergedDictionaries.Add((ResourceDictionary)XamlReader.Load(xaml));
5)为了让brushesStreamReader不在null
上面的代码中,我必须将xaml文件设置为“内容”。(为什么?)
6) 第 4 步中我的代码的第二个问题是尝试对 Styles.xaml 执行相同操作时。我Failed to assign to property 'System.Windows.ResourceDictionary.Source'
在最后一行(dic.MergedDictionaries.Add...)上得到一个“”。这可能是因为 Styles.xaml 将 Brushes.xaml 添加到了它自己的 MergedDictionaries:
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Brushes.xaml"/>
</ResourceDictionary.MergedDictionaries>
是吗?
谢谢!