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

Tor*_*gen 19 wpf resources xaml

在我的WPF项目中,我将用户控件保存在单独的库项目中.用户控件访问单独的XAML文件中的资源,如下所示:

<UserControl.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="/Resources/ViewResources.xaml" />
        </ResourceDictionary.MergedDictionaries>
        <!-- Local styles here -->
    </ResourceDictionary>
</UserControl.Resources>
Run Code Online (Sandbox Code Playgroud)

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

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

Set property 'System.Windows.ResourceDictionary.Source' threw an exception.
Run Code Online (Sandbox Code Playgroud)

...包装IOException:

Cannot locate resource 'resources/viewresources.xaml'.
Run Code Online (Sandbox Code Playgroud)

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

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

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

Tor*_*gen 26

找到了.

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

<UserControl.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="pack://application:,,,/RoutingManager;component/Resources/ViewResources.xaml" />
        </ResourceDictionary.MergedDictionaries>
        <!-- Local styles here -->
    </ResourceDictionary>
</UserControl.Resources>
Run Code Online (Sandbox Code Playgroud)

并修复了它.

  • 作为发现这一点的其他人的捷径,我将`Themes\AvalonDockTheme.xaml`改为`pack:// application:,,,/Themes/AvalonDockTheme.xaml`,因为引用的XAML在同一个程序集中.谢谢,Tor! (4认同)
  • 我无法让这个用于我使用资源的UserControls.所以我只是使用PropertyGrid从下拉列表中选择我的资源Xaml - 它产生了这样的格式:`<ResourceDictionary Source ="/ AssemblyName; component/Themes/Generic.xaml"/>`这对我有用. (3认同)

小智 24

我认为这是值得发布的,以防万一其他人正在努力解决同样的问题,因为我花了两个多小时与语法等进行斗争只是为了发现解决方案很简单,但不是那么明显:当引用时来自另一个控件库的打包资源,它似乎在设计时工作正常,甚至可以无错误地编译,但在运行时因"Set属性"而失败.System.Windows.ResourceDictionary.Source'抛出异常'错误.事实证明,仅仅从控件库引用资源程序集是不够的,您还需要在主应用程序程序集中向包含资源字典的程序集添加REFERENCE,否则它似乎没有编译到应用程序中.(即启动应用程序(带有app.xaml的应用程序) - >添加引用 - >选择带有引用资源文件的程序集.

希望这可以帮助!


Ale*_*Dev 7

在我的例子中,我在相同的库上有ResourceDictionary和UserControl,但是与主应用程序分开.对我有用的是以Adam在评论中建议的格式指定程序集的名称,并且我必须将项目中的ResourceDictionary从更改Embedded ResourcePage.我没有尝试使用pack://格式,但我认为它也会起作用.

<ResourceDictionary Source="/AssemblyName;component/Assets/MyResource.xaml"/>
Run Code Online (Sandbox Code Playgroud)