在另一个程序集中引用 ResourceDictionary

3

我有一个类库项目,它对于其他几个项目是通用的。它的程序集名称为"MyCompany",默认命名空间也为""。

然后,在这些其他项目中的一个(命名空间为"MyCompany.Something")中,我已经引用了dll,并且我想使用在"MyCompany"中拥有的资源字典。

我找到了这个:将ResourceDictionary添加到类库

所以我按照它说的做了,我的xaml文件位于"MyCompany"根目录下,命名为"Recursos.xaml",生成操作设置为Resource,不复制和空白自定义工具和自定义工具命名空间,其内容如下:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
  <ResourceDictionary.MergedDictionaries>
    <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Controls.xaml" />
    <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Fonts.xaml" />
    <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Colors.xaml" />
    <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Accents/Blue.xaml" />
    <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Accents/BaseLight.xaml" />
    <ResourceDictionary Source="pack://application:,,,/Resources/Icons.xaml"/>
 </ResourceDictionary.MergedDictionaries>
  -- some other styles...
 </ResourceDictionary>

然后,在我的WPF应用程序项目中,我在App.xaml中有以下内容:

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Controls.xaml" />
            <ResourceDictionary Source="pack://application:,,,/MyCompany;component/Recursos.xaml" />
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>

刚刚添加了Controls.xaml以进行测试,这个可以工作,但我的却不行:

查找资源字典"pack://application:,,,/MyCompany;component/Recursos.xaml"时发生错误。

所以我不知道为什么它不能识别它。参考是有效的,因为我可以使用它的每个类。


嗨,请尝试使用 <ResourceDictionary Source="/Isaval;component/Recursos.xaml"/>,并确保资源字典的构建操作为 Page - learningcs
@rshepp 仍然不起作用... - Pinx0
可能在Resources.xaml中有错误,您是否将其他字典合并到其中? - eran otzap
“on to it”是什么意思?Recursos.xaml的完整代码已经在那里了,而且没有任何错误。 - Pinx0
是的,在我的问题中有两个代码片段。第一个是Recursos.xaml,您可以在其中看到它已经合并了字典。 - Pinx0
显示剩余2条评论
3个回答

4
请试着这样做,它会起作用: 项目ABC引用了项目XYZ。
   <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary Source="/Project XYZ;component/YourSubFolder/YourResourceFile.xaml" />
    </ResourceDictionary.MergedDictionaries>

那么您可以直接使用在YourResourceFile.xaml中定义的资源。

是的,这与xtnd8建议的相同,因为文件不在任何子文件夹中。但它不起作用。 - Pinx0
是的,您可以直接指定,无需子文件夹。 - DeshDeep Singh

3

您需要将ResourceDictionary添加为:

<ResourceDictionary Source="/MyCompany;component/Recursos.xaml" />

所以,我理解你是将这个库作为外部引用添加的?它不是你解决方案中的另一个项目? - user5147454
不,这是另一种解决方案,它已经被编译并通过检查和选择dll添加为引用。 - Pinx0

0

我猜这对你两年后没什么帮助了,但或许能帮到其他人 :) 确保在引用外部xaml后关闭VS并重新打开sln... 这对我有用... XAML-编辑器部分仍然不是100%(在VS2017中要好得多,但仍然存在一些问题)

还有别忘了添加:

System.Reflection.Assembly.LoadFrom("yourResourceAssemblyfullpath")

在 Window/Control 的构造函数中,在调用 "InitializeComponent()" 之前使用资源。
    Sub New()

    System.Reflection.Assembly.LoadFrom("yourResourceAssemblyfullpath")
    InitializeComponent()

    End Sub

否则您会收到运行时错误...

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