WPF UserControl在引用项目中找不到XAML资源

时间:2010-09-20 00:03:17

标签: wpf xaml resources

在我的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'.

我该如何解决这个问题?我试图将资源文件的构建操作更改为“内容”,并将其复制到输出目录(适用于文件和类似的“哑”资源)。但无济于事。此外,它在用户控件中不起作用。

有没有更好的方法来指定路径?

我是否必须将资源文件移动到应用程序项目(我不愿意,因为它属于用户控件的域)。

5 个答案:

答案 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文件设置为嵌入式资源