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

资源程序集构建后,如何在应用程序的App.xaml中引用它?目前我使用ResourceDictionary。合并各个字典文件。如果我在一个程序集中有它们,我如何在xaml中引用它们?


当前回答

UWP:

<ResourceDictionary Source="ms-appx:///##Namespace.External.Assembly##/##FOLDER##/##FILE##.xaml" />

其他回答

只有资源的DLL是您的一个选项。但这并不是必需的,除非您希望在不重新编译应用程序的情况下修改资源。只有一个公共ResourceDictionary文件也是一种选择。这取决于你更换资源的频率等等。

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

MyAssembly -只有程序集名称,没有扩展名

FolderStructureInAssembly -如果资源在一个文件夹中,请指定文件夹结构

当你这样做的时候,最好了解siteOfOrigin以及。

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

使用XAML:

如果你知道其他程序集结构,并且想要c#代码中的资源,那么使用下面的代码:

 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。项目WpfControlLibrary1的xaml到StackOverflowApp项目。

项目结构:

资源字典:

代码的输出:

PS:所有ResourceDictionary文件都应该有“资源”或“页面”的构建动作。

使用c#:

如果有人想要纯c#代码的解决方案,然后看看我的这个 解决方案。

检查包的URI语法。你想要这样的东西:

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

举个例子,让这个15秒的答案

说你有“风格”。在一个名为common的WPF库中,你想在你的主应用程序项目中使用它:

添加一个从主项目到“公共”项目的引用 你的app.xaml应该包含:


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

UWP:

<ResourceDictionary Source="ms-appx:///##Namespace.External.Assembly##/##FOLDER##/##FILE##.xaml" />