考虑一个文件| WPF应用程序的新项目,包含:
从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。如果我在没有pack://应用程序的东西的情况下将上面的内容更改为Source =“Dictionary1.xaml”,那么我会在尝试构造MainWindow时遇到由IOException引起的XamlParseException“找不到资源'dictionary1.xaml'”。 / p>
我的问题: 关于相对URI解析的generic.xaml有什么特别之处?为什么?
答案 0 :(得分:10)
对不起,因为我没有能力写评论,所以我将其作为答案发布。
我有同样的情况,一切都适合我。我不需要在Generic.xaml的路径中放入“pack:// application”。但只有当程序集的输出类型是“Windows应用程序”时。
对于“类库”我需要在路径(Source="/ClassLibarayAssemblyName;component/Themes/Dictionary1.xaml"
)中添加程序集名称,因为没有它,WPF引擎会尝试在应用程序的主程序集中查找Dictionary1.xaml。
两种情况下的目标框架都是“.NET Framework 4 Client Profile”
答案 1 :(得分:0)
只是猜测:generic.xaml也需要可以从外部程序集访问,因此这是一种确保可以使用绝对URI从任何地方找到资源的方法。正如我所说,这只是在黑暗中刺伤,不确定。