谢谢!
附言: 我已经搜索了这个主题,但那里有很多来自不懂行的人的垃圾答案。鉴于我对WPF相对较新,我宁愿直接得到我的问题的答案。
经过一些尝试和研究后,我找到了解决自己问题的方法。似乎我的答案的各个部分散落在整个网络中,所以我将尝试在一个地方一次性地解释整个过程。简单概括一下,我基本上想要在我的解决方案中集中使用跨项目使用的任何资源。以下是我最终采取的步骤:
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),它们给了我组合所有这些元素所需的东西。
Load WPF styles or other Static Resources from an external file or assembly