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

标签 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: 搞砸堆栈跟踪,这里是缩小问题的范围:

主题样式定义主题颜色。 一般样式在遇到绑定(bind)之前保持加载正常,就像这个一样

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

所以,StaticResource解析失败,抛出异常。可以通过某种方式避免这种情况吗?

最佳答案

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

一种解决方案是使用 Application.GetResourceStreamStreamReader 提取 Xaml。然后使用XamlReader 构造ResourceDictionary。这样你就可以确保依赖字典可以找到他们需要的静态资源。

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

关于silverlight - 在运行时添加 ResourceDictonary 时出现异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4133933/

相关文章:

Silverlight:文本修剪被切断的按钮模板

silverlight - 如何在绑定(bind)中将 TargetNullValue 设置为 Visibility.Collapsed

windows-phone-7 - 如何录制音频AMR格式?

银光/WP7 : programmatically change the button background image

wcf - 在Windows Server 2012中安装Silverlight 4,Ria服务应用程序不工作

c# - 调整图像大小并保持纵横比

c# - 从 Windows Phone 7 向服务器发送请求

wpf - 在另一个程序集中查找合并的资源字典时出错

c# - 添加 ResourceDictionary 后 MyApp.App 不包含 Initialize 的定义

c# - 应用程序资源中的 WPF 资源字典