在我的WPF项目中,我将用户控件保存在单独的库项目中。用户控件访问单独的XAML文件中的资源,如下所示:
<UserControl.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/Resources/ViewResources.xaml" />
</ResourceDictionary.MergedDictionaries>
<!-- Local styles here -->
</ResourceDictionary>
</UserControl.Resources>
资源文件ViewResources.xaml驻留在名为Resources的控件库项目的文件夹中。它具有默认的构建操作(页面)和自定义工具(MSBuild:Compile)。
问题是当我在WPF应用程序中引用控件库并使用用户控件时。在运行时,我得到以下XamlParseException:
Set property 'System.Windows.ResourceDictionary.Source' threw an exception.
...包装IOException:
Cannot locate resource 'resources/viewresources.xaml'.
我该如何解决这个问题?我试图将资源文件的构建操作更改为“内容”,并将其复制到输出目录(适用于文件和类似的“哑”资源)。但无济于事。此外,它在用户控件中不起作用。
有没有更好的方法来指定路径?
我是否必须将资源文件移动到应用程序项目(我不愿意,因为它属于用户控件的域)。
答案 0 :(得分:26)
找到它。
原来有一种更好的方法来指定路径Pack URIs。我将XAML更改为以下内容:
<UserControl.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="pack://application:,,,/RoutingManager;component/Resources/ViewResources.xaml" />
</ResourceDictionary.MergedDictionaries>
<!-- Local styles here -->
</ResourceDictionary>
</UserControl.Resources>
并修复了它。
答案 1 :(得分:24)
我认为值得张贴这个以防万一其他人正在努力解决同样的问题,因为我花了两个多小时与语法等进行斗争才发现解决方案很简单,但不是那么明显: 当从另一个控件库引用打包资源时,它似乎在设计时工作正常,甚至编译时没有错误,但在运行时因“Set属性”而失败.System.Windows.ResourceDictionary.Source'引发了异常'错误。事实证明,仅仅从控件库引用资源程序集是不够的,您还需要在主应用程序集中添加包含资源字典的程序集的REFERENCE,否则它似乎没有被编译到应用程序中。 (即启动应用程序(带有app.xaml的应用程序) - &gt;添加引用 - &gt;选择带有引用资源文件的程序集。
希望这有帮助!
答案 2 :(得分:7)
在我的情况下,我在相同的库上有ResourceDictionary和UserControl,但与主应用程序分开。对我有用的是以Adam在评论中建议的格式指定程序集的名称,并且我必须将项目中的ResourceDictionary从Embedded Resource
更改为Page
。我没有尝试使用pack://格式,但我认为它也可以使用。
<ResourceDictionary Source="/AssemblyName;component/Assets/MyResource.xaml"/>
答案 3 :(得分:1)
我遇到了同样的错误( IOException - 找不到文件),这让我在生命中度过了一天,我永远都不会回来。
既不使用更简单的“ / assemblyname ... ”也不使用“ pack:// .... ”语法。
我正确引用了我的主程序集中的资源程序集。
当我将我的xaml资源文件Build Action属性更改为“Resource”时,错误消失了,如上所述。
然而,我在这一行遇到了一个XamlParseException:
<ImageBrush x:Key="WindowBackground" ImageSource="Images/gradient.png" />
(我手工打字)。
这使得我试图包含的xaml资源文件实际上包含了无效的依赖项。
奇怪修复是删除我输入的ImageSource属性,重新插入它但是从下拉菜单中选择图像作为结果。
即使生成的行看起来完全相同,但显然不是。
开始不喜欢WPF(VS2013),但希望这有帮助。
:0 /
答案 4 :(得分:0)
我遇到了同样的情况,但是Pack URI并没有帮助我,我仍然在引用(可执行)项目中得到“无法找到资源...”异常。对我有帮助的是将自定义控件库项目中的ResourceDictionary文件设置为嵌入式资源。