3

我正在尝试开发一种根据设置切换 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 无法解析并引发异常。可以以某种方式避免这种情况吗?

4

2 回答 2

2

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

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

请注意,在加载其他依赖字典之前,您需要确保已将每个字典添加到其中,使其成为Application.Resources树的一部分。

于 2010-11-09T13:55:23.163 回答
1

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

解决方法是像使用 Silverlight3 一样简单地创建一个 ResourceDictionary -遵循本教程

我希望这能解决问题。

于 2010-11-09T13:37:18.140 回答