我正在尝试开发一种根据设置来切换Windows Phone 7应用程序样式的方法。样式看起来像这样:

  • 核心样式在wp7style_dark.xaml和wp7style_light.xaml中分开和定义
  • 其余样式以样式声明。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会引发异常(这是系统。表明“未指定错误”)。我发现,如果我清空样式。xaml,我发现例外消失了,但这当然不是解决方案。

我该怎么办?

更新2: 拧紧堆栈跟踪,这是问题缩小的问题:

主题样式定义了主题颜色。一般的样式一直保持正常状态,直到遇到绑定为止,就像这样

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

因此,静电剂无法解决并抛出异常。这可以避免以某种方式避免吗?

有帮助吗?

解决方案

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

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

请注意,您需要确保您在位置添加了每个字典,以便它是 Application.Resources 在加载其他依赖词典之前的树。

其他提示

WP7基于Silverlight 3+,默认情况下不可能在代码中创建一个新的资源词典,这就是为什么您要收到一个 System.Exception 说明“未指定的”。

解决方法,简单创建了一个资源重视,就好像您正在使用Silverlight3- 遵循本教程.

我希望这能解决问题。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top