WPF在多层/项目应用程序解决方案中集中xaml / image资源

时间:2012-12-02 00:12:08

标签: wpf xaml mvvm user-controls resourcedictionary

我的情况是这样的。 我在WPF解决方案下有多个项目,构成我正在开发的多层应用程序。由于单独的项目有时需要访问相同的图像或xaml资源,我希望集中化" Public"一个项目的资源,可以被任何其他项目引用,这些项目需要这些项目" Public"资源。例如,我有一个BMP图像,我在各个控件和窗口中使用单独的项目作为横幅/徽标。看起来我应该能够将此图像作为资源添加到公共资源项目中,并从我的其他项目中引用它,而不是将图像单独添加到需要它的每个项目中。如果这是可能的,它会是什么样子,我应该怎么做呢?如果我的想法很糟糕,我可以接受建议,但项目将会非常庞大​​,所以我不想在整个地方添加资源。

谢谢!

P.S。 我已经搜索了这个主题了很多但是有很多垃圾回答来自那些不知道他们在做什么的人。鉴于我对WPF相对较新,我宁愿直接回答我的问题。

1 个答案:

答案 0 :(得分: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>

如您所见,引用外部资源字典需要一个称为“包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错误,但在运行时它会抛出set属性,无法找到文件异常。当我从我的启动项目中引用我的资源项目时,这就消失了。

希望这有助于某人。 下面是一些指向一些地方的链接(包括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