WPF多层/项目应用程序解决方案中心化XAML/图像资源

11
我的情况是这样的。我有一个WPF解决方案下的多个项目构成的多层应用正在开发中。由于单独的项目有时需要访问相同的图像或xaml资源,因此我希望将"公共"资源集中到一个项目中,以便任何其他需要这些"公共"资源的项目都可以引用它们。例如,我有一个BMP图像,在不同的项目中的控件和窗口中使用作为横幅/标志。看起来我应该能够将此图像添加为公共资源项目的资源,并从我的其他项目中引用它,而不是在每个需要此图像的项目中单独添加它。如果可能的话,它会是什么样子,我该如何做?如果我的想法很糟糕,我也愿意听取建议,但是项目会非常大,所以我不想在各处添加资源。
谢谢!
附言: 我已经搜索了这个主题,但那里有很多来自不懂行的人的垃圾答案。鉴于我对WPF相对较新,我宁愿直接得到我的问题的答案。
1个回答

23

经过一些尝试和研究后,我找到了解决自己问题的方法。似乎我的答案的各个部分散落在整个网络中,所以我将尝试在一个地方一次性地解释整个过程。简单概括一下,我基本上想要在我的解决方案中集中使用跨项目使用的任何资源。以下是我最终采取的步骤:

1. 在您的解决方案中创建一个用户控件项目(可以承载资源字典的任何项目都可以)。我将称此项目为“资源项目”。

2. 将任何想要在项目之间共享的资源文件(如图像等)添加到资源项目中。我尝试组织有意义的子目录中的文件。您将需要将构建操作设置为“资源”,以便它被编译到输出二进制文件中。

3. 现在,在资源项目中添加资源字典。在我的情况下,我希望引用几个图像,所以我创建了一个名为“ImageDictionary.xaml”的资源字典。

4. 在资源字典中添加对图像文件的引用。我这里引用的是图像,但只是一个资源字典,您可以放置任何内容。中间的字符串只是指向所引用的图像文件的相对路径。

<ImageSource x:Key="SomeImageKey"> 
    Images/SomeImage.bmp
</ImageSource>

5. 现在转到需要使用步骤 4 中刚刚制作的资源字典的项目。它可以是另一个用户控件或窗口,无论哪种方式,在项目引用上右键单击,然后添加到资源项目的引用。

6. 现在当前项目需要引用在资源项目中定义的步骤 4 中制作的字典。我首先创建了一个用户控件,所以我的代码如下所示...请注意,我使用了合并字典。我计划后面还要使用更多,所以我选择了这种方式而不是单个字典。 "ResourceProject" 是您添加资源的项目/程序集的名称。 "component" 是必须存在的关键字,后面跟着字典 XAML 代码文件的路径。

<UserControl.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="/ResourceProjectAssembly;component/Resources/ImageDictionary.xaml" />  
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>        
    </UserControl.Resources>

正如您所看到的,引用外部资源字典需要使用称为“Pack URI”的东西。我找到了一个简便的方法来处理它。从我所知道的角度来看,长期以来并没有什么优势,而且这种做法也相当于一种丑陋的方式。但以下是长期以来的具体实现方式。

<UserControl.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="pack://application:,,,/ResourceProjectAssembly;component/Resources/ImageDictionary.xaml" />  
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>        
    </UserControl.Resources>

7. 现在你的当前项目与资源项目的资源字典有了引用,你可以使用该字典中的任何内容。我已经在我的用户控件中放置了一张图片。下面是代码。就像本地引用字典一样简单。

<Image Source="{StaticResource SomeImageKey}" />

8. 重要提示!在找到解决方法之前,这让我头痛了一段时间。确保您的解决方案中的启动项目引用了资源项目,即使启动项目不使用资源项目。(即右键单击“引用”,添加引用等...)除非您这样做,否则资源将不会编译到输出中。这部分很棘手,因为设计师甚至显示了我的图像,而我没有XAML错误,但在运行时它会抛出设置属性和找不到文件异常。当我从启动项目引用我的资源项目时,问题就解决了。

希望这对某人有所帮助。 以下是一些链接(包括stackoverflow),它们给了我组合所有这些元素所需的东西。

http://blogs.msdn.com/b/wpfsldesigner/archive/2010/06/03/creating-and-consuming-resource-dictionaries-in-wpf-and-silverlight.aspx

Load WPF styles or other Static Resources from an external file or assembly

ResourceDictionary in a separate assembly


非常出色的研究。正是我所需要的 +1。 - Andez
非常感谢,之前我无法让它工作,因为我错过了第8步 :(。但现在它可以工作了,太棒了 :)。 - adminSoftDK
我可以在资源字典中添加 <String></String> 吗? - Ahmed Fwela
是的,有几种方法可以做到这一点。这里有另一个问题,讨论了几种实现它的方法。 https://dev59.com/9W035IYBdhLWcg3wC7YR - akagixxer

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