WPF用户控件在引用项目中找不到XAML资源。

22

在我的WPF项目中,我将用户控件保留在一个单独的库项目中。该用户控件可以通过访问另一个XAML文件中的资源,如下所示:

<UserControl.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="/Resources/ViewResources.xaml" />
        </ResourceDictionary.MergedDictionaries>
        <!-- Local styles here -->
    </ResourceDictionary>
</UserControl.Resources>

资源文件ViewResources.xaml位于控件库项目中名为Resources的文件夹中。它具有默认的构建操作(Page)和自定义工具(MSBuild:Compile)。

问题是当我在我的WPF应用程序中引用控件库并使用用户控件时,在运行时我会得到以下XamlParseException:

Set property 'System.Windows.ResourceDictionary.Source' threw an exception.

...它包装了 IOException 异常:

Cannot locate resource 'resources/viewresources.xaml'.

我该如何修复这个问题?我尝试将资源文件的构建操作更改为"Content"并将其复制到输出目录(对于文件和类似的“愚蠢”资源有效),但是没有用。而且,在用户控件中不起作用。

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

我是否需要将资源文件移动到应用程序项目中(我宁愿不这样做,因为它属于用户控件的领域)。

5个回答

29

找到了。

事实证明有更好的指定路径的方法,打包URI。我将XAML更改为以下内容:

<UserControl.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="pack://application:,,,/RoutingManager;component/Resources/ViewResources.xaml" />
        </ResourceDictionary.MergedDictionaries>
        <!-- Local styles here -->
    </ResourceDictionary>
</UserControl.Resources>

然后问题就解决了。


5
为了方便其他人,如果引用的XAML在同一个程序集中,我将Themes\AvalonDockTheme.xaml更改为pack://application:,,,/Themes/AvalonDockTheme.xaml。感谢Tor! - Matt DeKrey
4
我无法让这对于使用资源的我的用户控件起作用。所以我简单地使用了PropertyGrid从下拉列表中选择我的资源Xaml - 它导致格式如下:<ResourceDictionary Source="/AssemblyName;component/Themes/Generic.xaml"/> 这对我有用。 - Adam
这个链接好像出了点问题。MSDN 上说该内容已不再提供。要修复它,可以在页面中选择“.NET 4.0”的内容。这是直接链接:https://msdn.microsoft.com/zh-cn/library/aa970069(v=vs.100).aspx - ygoe

23

我认为这篇文章很值得分享,以防其他人遇到同样的问题,因为我花了两个多小时与语法等问题作斗争,却发现解决方案非常简单,但并不那么明显:

在从另一个控制库引用打包资源时,它在设计时似乎可以正常工作,甚至编译也没有错误,但在运行时会出现“设置属性'System.Windows.ResourceDictionary.Source'抛出异常”的错误。事实证明,仅仅从你的控制库引用资源程序集是不够的,你还需要向你的主应用程序集添加一个包含资源字典的程序集引用,否则似乎它不会被编译到应用程序中(即启动应用程序(具有app.xaml的应用程序)->添加引用->选择具有引用资源文件/ s的程序集)。

希望这能帮到你!


1
在我的情况下,我只有.xaml资源。为了使用打包URI,我必须将它们明确添加到我的项目中。回想起来似乎很明显,但当你盯着一个错误看时,它说它们不存在于实际上存在的位置,这是令人困惑的。 - dudeNumber4
谢谢,省了我好几个小时的时间。我给你点了两个赞! - sunefred

7
在我的情况下,我有ResourceDictionary和UserControl在同一个库中,但与主应用程序分开。对我有效的是按照Adam在评论中建议的格式指定程序集的名称,并且我还必须将项目中的ResourceDictionary从“嵌入式资源”更改为“页面”。我没有尝试使用pack://格式,但我认为它也能够工作。
<ResourceDictionary Source="/AssemblyName;component/Assets/MyResource.xaml"/>

我已将我的资源更改为尝试使其工作。尝试了这里的一些格式来使用相同的程序集资源,这个方法有效,谢谢。<ResourceDictionary Source="pack://application:,,,/Physician/DiagnosesShared.xaml" /> - Maslow

2

我曾经遇到过相同的错误(IOException - 文件未找到),导致我浪费了一整天的时间,这段时间再也无法挽回。

对于我来说,既不使用简单的"/assemblyname..."语法,也不使用"pack://...."语法都无法解决问题。

我正确地将资源程序集引用到了我的主程序集中。

当我将xaml资源文件的Build Action属性更改为"Resource"时,错误消失了,如上所述。

然而,之后我在这一行遇到了XamlParseException:

<ImageBrush x:Key="WindowBackground" ImageSource="Images/gradient.png" />

(我手动输入的)。

这导致我试图包含的xaml资源文件实际上具有无效的依赖项。

奇怪的是,解决方法是删除我输入的ImageSource属性,然后重新插入它,但从出现的下拉菜单中选择图像。

即使结果行看起来完全相同,但显然不是。

开始不喜欢WPF(VS2013),但希望这可以帮到你。

:0/


0
我遇到了同样的情况,但是 Pack URIs 对我没有帮助,我在引用(可执行)项目中仍然会得到“无法定位资源…”的异常。对我有帮助的是将自定义控件库项目中我的 ResourceDictionary 文件设置为嵌入式资源

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接