【问题标题】:Exception when adding a ResourceDictonary at runtime在运行时添加 ResourceDictionary 时出现异常
【发布时间】:2010-11-09 13:03:50
【问题描述】:

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

【问题讨论】:

  • 异常类型和内容似乎有点少。你确定类型?有没有内部异常?
  • 这实际上是过去几个小时让我头疼的原因。我预计至少会出现 XamlParseException,但唉。

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


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

    我希望这能解决问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-06
      • 2018-06-23
      • 1970-01-01
      • 2019-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多