在运行时添加ResourceDictonary时出现异常

时间:2010-11-09 13:03:50

标签: silverlight windows-phone-7 resourcedictionary windows-phone

我正在尝试根据设置开发一种切换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:拧紧堆栈跟踪,这里的问题缩小了:

主题样式定义主题颜色。 一般样式保持正常加载,直到它们遇到绑定,就像这个

... <Setter Property="Color" Value="{StaticResource HighlightColor}" />

因此,StaticResource无法解析并抛出异常。这可以以某种方式避免吗?

2 个答案:

答案 0 :(得分:2)

我用这种方法发现的问题是,似乎有一些关于资源字典如何从Source属性中的URL加载自身的异步性。因此,当一个字典使用{StaticResource key} key在前一个字典中时,它可能会失败。

一种解决方案是使用Application.GetResourceStreamStreamReader提取Xaml。然后使用XamlReader构建ResourceDictionary。这样,您可以确定依赖词典可以找到所需的静态资源。

请注意,您需要确保已添加每个字典,以便在加载其他相关字典之前将其作为Application.Resources树的一部分。

答案 1 :(得分:1)

WP7基于Silverlight 3+,默认情况下无法在代码中创建新的资源字典,这就是您收到System.Exception声明“UnspecifiedError”的原因。

解决方法,简单地创建一个ResourceDictionary,就像使用Silverlight3一样 - follow this tutorial

我希望这能解决问题。