好吧,经过一些修补和研究,我找到了解决我自己问题的方法。似乎我的答案的零碎散布在整个网络上,所以我将尝试在一个地方一次解释整个事情。回顾一下,我基本上想在我的解决方案中集中跨项目使用的任何资源。这些是我最终完成此任务所遵循的步骤。
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-sumption-resource-dictionaries-in-wpf-and-silverlight.aspx
从外部文件或程序集加载 WPF 样式或其他静态资源
ResourceDictionary 在单独的程序集中