我正在尝试开发一种根据设置切换 Windows Phone 7 应用程序样式的方法。 样式如下所示:
- 核心样式在 WP7Style_Dark.xaml 和 WP7Style_Light.xaml 中分离和定义
- 其余样式在 Styles.xaml 中声明
我使用以下代码连接 App.xaml.cs 中的主题:
var dictionaries = Resources.MergedDictionaries;
dictionaries.Clear();
string source = String.Format("/CommonUI;component/Resources/{0}.xaml", value == AppStyleSet.Light ? "WP7Style_Light" : "WP7Style_Dark");
//base styles
var themeStyles = new ResourceDictionary {Source = new Uri(source, UriKind.Relative)};
dictionaries.Add(themeStyles);
var generalStyles = new ResourceDictionary();
generalStyles.Source = new Uri("/CommonUI;component/Resources/Styles.xaml",UriKind.Relative);
dictionaries.Add(generalStyles);
执行时,设置 generalStyles.Source 会抛出异常(这是一个 System.Exception,指出“未指定的错误”)。我发现如果我清空 Styles.xaml,异常就会消失,但这当然不是解决方案。
我该怎么办?
更新 2: 搞砸堆栈跟踪,这里是缩小问题的范围:
主题样式定义主题颜色。 一般样式在遇到绑定(bind)之前保持加载正常,就像这个一样
... <Setter Property="Color" Value="{StaticResource HighlightColor}" />
所以,StaticResource解析失败,抛出异常。可以通过某种方式避免这种情况吗?
最佳答案
我发现这种方法的问题是资源字典如何从 Source
属性中的 URL 加载自身似乎存在一些异步性。因此,当一个字典使用 {StaticResource key}
时,其中 key
在以前的字典中,它可能会失败。
一种解决方案是使用 Application.GetResourceStream
和 StreamReader
提取 Xaml。然后使用XamlReader
构造ResourceDictionary
。这样你就可以确保依赖字典可以找到他们需要的静态资源。
请注意,在加载其他相关词典之前,您需要确保已添加每个词典,使其成为 Application.Resources
树的一部分。
关于silverlight - 在运行时添加 ResourceDictonary 时出现异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4133933/