ResourceDictionary在单独的程序集中


245

我有要在多个单独的应用程序中使用的资源字典文件(MenuTemplate.xaml,ButtonTemplate.xaml等)。我可以将它们添加到应用程序的程序集中,但是最好将这些资源编译到一个程序集中,并让我的应用程序引用它,对吗?

构建资源程序集后,如何在我的应用程序的App.xaml中引用它?当前,我使用ResourceDictionary.MergedDictionaries合并单个词典文件。如果我将它们放在程序集中,如何在xaml中引用它们?


1
这可能是一个矫kill过正,但您可能希望使用此处描述的技术为“导出”准备资源:alexfeinberg.wordpress.com/2015/08/16/…。这样做的主要优点是可以防止将多个版本的资源程序集加载到同一appdomain中的问题。
user195275

Answers:


352

查看pack URI语法。您想要这样的东西:

<ResourceDictionary Source="pack://application:,,,/YourAssembly;component/Subfolder/YourResourceFile.xaml"/>

1
如果YourAssembly未包含在应用程序路径中怎么办?
SaneDeveloper

@Engineer Spock:然后CLR将在没有帮助的情况下找不到它(与WPF无关)。将探测路径添加到您的app.config,或附加AppDomain.AssemblyResolve以帮助它找到程序集。
肯特·布加亚特

1
如果YourAssembly项目与需要引用YourAssembly的应用程序项目处于同一级别,我是否需要添加探测路径?例如,C:\ Solution \ AppProject \和C:\ Solution \ YourAssemblyProject \
SaneDeveloper 2013年

1
@EngineerSpock:这是一个单独的问题,所以请打开一个。
肯特·布加亚特

2
这个答案没有道理。为了遵循它,一个人已经需要知道如何去做!
user1040323 18-10-16

97

举例来说,仅需15秒即可回答-

假设您在名为“ common”的WPF库中具有“ styles.xaml”,并且要在主应用程序项目中使用它:

  1. 从主项目向“常见”项目添加引用
  2. 您的app.xaml应该包含:

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="pack://application:,,,/Common;component/styles.xaml"/>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>

干杯


2
然后,如何通过Visual Studio 2010“属性”窗口使styles.xaml中定义的资源可用?如果选择一个元素,然后为其“背景”属性单击“应用资源”,则它仅显示SystemColors,而不显示styles.xaml中定义的颜色。但是,如果我自己在XAML中键入资源名称,则它可以工作,因此可以正确地引用它。
xr280xr

只是想补充一下,如果您从UserControl引用ResourceDictionary,则需要在两个位置(在UserControl和主窗口项目中)添加对程序集的引用。否则,您将收到运行时错误。
Andrejs Gasilovs


16

仅资源DLL是您的一个选择。但这不是必需的,除非您要修改资源而不重新编译应用程序。也可以选择只有一个公共ResourceDictionary文件。这取决于您更改资源等的频率。

<ResourceDictionary Source="pack://application:,,,/
     <MyAssembly>;component/<FolderStructureInAssembly>/<ResourceFile.xaml>"/>

MyAssembly-仅扩展名,无扩展名

FolderStructureInAssembly-如果资源位于文件夹中,请指定文件夹结构

在执行此操作时,最好也了解siteOfOrigin

WPF支持两个权限:application:///和siteoforigin:///。application:///权限标识在编译时已知的应用程序数据文件,包括资源和内容文件。siteoforigin:///权限标识原始文件的站点。下图显示了每个权限的范围。

在此处输入图片说明



4

使用XAML:

如果你知道其他的assembly结构,并希望resourcesC#代码,然后用下面的代码:

 ResourceDictionary dictionary = new ResourceDictionary();
 dictionary.Source = new Uri("pack://application:,,,/WpfControlLibrary1;Component/RD1.xaml", UriKind.Absolute);
 foreach (var item in dictionary.Values)
 {
    //operations
 }

输出:如果我们要使用ResourceDictionary RD1.xamlProject WpfControlLibrary1进入StackOverflowApp项目。

项目结构

项目结构

资源字典: 资源字典

代码输出:

输出量

PS:所有ResourceDictionary文件都应带有Build ActionResource”或“ Page”。

使用C#:

如果有人想要纯c#代码的解决方案,请参阅我的解决方案。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.