10

考虑一个文件 | WPF 应用程序的新项目,其中包含:

  1. 一个名为 CustomControl1 的新自定义控件
  2. 两个名为 Dictionary1 和 Dictionary2 的新资源字典

从 Generic.xaml 中取出生成的样式并将其移至 Dictionary2。然后将 Dictionary2 合并到 Dictionary1 中,将 Dictionary1 合并到 Generic 中,如下所示:

<!--Generic.xaml-->
<ResourceDictionary.MergedDictionaries>
    <ResourceDictionary Source="pack://application:,,,/Themes/Dictionary1.xaml"/>
</ResourceDictionary.MergedDictionaries>

<!--Dictionary1.xaml-->
<ResourceDictionary.MergedDictionaries>
    <ResourceDictionary Source="Dictionary2.xaml"/>
</ResourceDictionary.MergedDictionaries>

然后,将 CustomControl1 的一个实例添加到 MainWindow 的网格中。(这部分是重现问题所必需的。项目总是编译得很好——只有在运行时才会出现问题,并且必须引用字典。)

在 Dictionary1.xaml 中,我将合并到同一文件夹中的另一个 dict 中,因此一个简单的 Source="Dictionary2.xaml" 可以工作。然而在 Generic.xaml 中,我必须使用绝对 URI。如果我将上面的内容更改为 Source="Dictionary1.xaml" 而没有 pack://application 东西,那么当它尝试构造 MainWindow 时,我会得到一个由 IOException“无法定位资源 'dictionary1.xaml'”引起的 XamlParseException。

我的问题: generic.xaml 关于相对 URI 解析有什么特别之处,为什么?

4

2 回答 2

11

对不起,因为我没有能力写评论,所以我发布这个作为答案。

我有同样的情况,一切对我来说都很好。我不需要将“pack://application”放在 Generic.xaml 的路径中。但仅当程序集的输出类型为“Windows 应用程序”时。对于“类库”,我需要将程序集名称添加到路径 ( Source="/ClassLibarayAssemblyName;component/Themes/Dictionary1.xaml"),因为没有它 WPF 引擎会尝试在应用程序的主程序集中查找 Dictionary1.xaml。

两种情况下的目标框架都是“.NET Framework 4 Client Profile”

于 2011-10-12T14:08:50.770 回答
1

只是一个猜测:generic.xaml 也需要可以从外部程序集访问,因此这是一种确保可以使用绝对 URI 从任何地方找到资源的方法。正如我所说,这只是在黑暗中刺伤,不确定。

于 2010-09-18T10:56:42.800 回答