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

aka*_*xer 11 wpf xaml user-controls mvvm resourcedictionary

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

谢谢!

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

aka*_*xer 23

经过一些修补和研究后,我找到了解决自己问题的方法.看起来我的答案的点点滴滴散落在整个网络上,所以我会尝试在一个地方同时解释整个事情.为了重新限制,我基本上希望集中在我的解决方案中跨项目使用的任何资源.这些是我最终为实现这一目标而采取的步骤.

1.在解决方案中创建一个用户控件项目(任何可以托管资源字典的项目都可以).我将这个项目称为"资源项目".

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

3.现在将资源字典添加到资源项目中.在我的情况下,我想引用几个图像,所以我做了一个名为"ImageDictionary.xaml".

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

<ImageSource x:Key="SomeImageKey"> 
    Images/SomeImage.bmp
</ImageSource>
Run Code Online (Sandbox Code Playgroud)

5.现在转到需要您刚刚在步骤4中创建的资源字典的项目.它可以是另一个用户控件或窗口,无论如何.右键单击项目引用并添加对资源项目的引用.

6.现在,当前项目需要引用您在资源项目中定义的步骤4中创建的字典.我首先创建了一个用户控件,所以这就是我的代码在下面的样子...注意我使用了合并的字典.我打算稍后再使用,所以我选择了这种方式而不是单一的字典.下面的"ResourceProject"是您将资源添加到的项目/程序集的名称."component"是需要存在的关键字,后跟字典xaml代码文件的路径.

<UserControl.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="/ResourceProjectAssembly;component/Resources/ImageDictionary.xaml" />  
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>        
    </UserControl.Resources>
Run Code Online (Sandbox Code Playgroud)

如您所见,引用外部资源字典需要一个称为"包URI"的东西.我找到了一个简单的方法.漫长的道路是相当丑陋的,据我所知,它没有任何优势.但这就是漫长的方式.

<UserControl.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="pack://application:,,,/ResourceProjectAssembly;component/Resources/ImageDictionary.xaml" />  
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>        
    </UserControl.Resources>
Run Code Online (Sandbox Code Playgroud)

7.既然您当前的项目引用了资源项目中的资源字典,您可以使用该字典中的任何内容.我继续把图像放在我的用户控件中.下面是代码.就像在本地引用字典一样.

<Image Source="{StaticResource SomeImageKey}" />
Run Code Online (Sandbox Code Playgroud)

8.重要提示!在我找到它之前,这让我头疼了一会儿.确保解决方案中的启动项目引用资源项目即使启动项目不使用资源项目也是如此.(即右键单击引用,添加引用等...)除非您这样做,否则资源不会被编译到输出中.这部分是棘手的,因为设计师甚至显示我的图像,我没有xaml错误,但在运行时它会抛出set属性,无法找到文件异常.当我从我的启动项目中引用我的资源项目时,这就消失了.

希望这有助于某人.下面是一些指向一些地方的链接(包括stackoverflow),这些链接给了我将所有部分放在一起所需的内容.

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

从外部文件或程序集加载WPF样式或其他静态资源

ResourceDictionary在一个单独的程序集中