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

标签 wpf xaml mvvm user-controls resourcedictionary

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

谢谢!

附言
我已经对这个主题进行了相当多的搜索,但是那里有很多不知道自己在做什么的人提供的垃圾答案。鉴于我对 WPF 比较陌生,我宁愿直接回答我的问题。

最佳答案

好吧,经过一些修补和研究,我找到了解决我自己问题的方法。似乎我的答案的零碎散布在整个网络上,所以我将尝试在一个地方一次解释整个事情。回顾一下,我基本上想在我的解决方案中集中跨项目使用的任何资源。这些是我最终完成此任务所遵循的步骤。

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

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

3.
现在将资源字典添加到资源项目。就我而言,我想引用几张图片,所以我制作了一张名为“ImageDictionary.xaml”的图片。

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

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

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

6.
好的,现在当前项目需要引用您在步骤 4 中创建的在资源项目中定义的字典。我首先制作了一个用户控件,所以这就是我的代码如下所示...请注意,我使用了合并字典。我计划稍后使用更多,所以我选择了这种方式而不是单个字典。
下面的“ResourceProject”是您添加资源的项目/程序集的名称。
“组件”是一个需要存在的关键字,后跟字典 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 错误,但在运行时它会抛出 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

关于WPF 在多层/项目应用解决方案中集中 xaml/image 资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13665120/

相关文章:

c# - 如何加载外部 XAML ResourceDictionary

silverlight - 隔离存储MVVM Silverlight抛出NotSupportedException

java - 何时使用 BindingAdapter,何时使用 MVVM 中的 liveData 或 observable 字段?

c# - 将 ListView 的高度固定为空白

wpf - 如何防止 WPF 对话框中的键盘事件渗透到调用它的 MFC 应用程序?

wpf - 在文本框中添加前导 0

c# - DataGrid 每一行中的组合框

c# - 将文件扩展名关联到 C# 应用程序中的应用程序

xaml - 如何从 ViewModel 访问属性到 Xaml View 的 CodeBehind 内的 ButtonClickEvent?

c# - WPF 设计器错误值不能为空。参数名称 : pattern