我正在尝试根据设置开发一种切换Windows Phone 7应用程序样式的方法。 样式如下所示:
我使用以下代码来连接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:拧紧堆栈跟踪,这里的问题缩小了:
主题样式定义主题颜色。 一般样式保持正常加载,直到它们遇到绑定,就像这个
... <Setter Property="Color" Value="{StaticResource HighlightColor}" />
因此,StaticResource无法解析并抛出异常。这可以以某种方式避免吗?
答案 0 :(得分:2)
我用这种方法发现的问题是,似乎有一些关于资源字典如何从Source
属性中的URL加载自身的异步性。因此,当一个字典使用{StaticResource key}
key
在前一个字典中时,它可能会失败。
一种解决方案是使用Application.GetResourceStream
和StreamReader
提取Xaml。然后使用XamlReader
构建ResourceDictionary
。这样,您可以确定依赖词典可以找到所需的静态资源。
请注意,您需要确保已添加每个字典,以便在加载其他相关字典之前将其作为Application.Resources
树的一部分。
答案 1 :(得分:1)
WP7基于Silverlight 3+,默认情况下无法在代码中创建新的资源字典,这就是您收到System.Exception
声明“UnspecifiedError”的原因。
解决方法,简单地创建一个ResourceDictionary,就像使用Silverlight3一样 - follow this tutorial。
我希望这能解决问题。