通过 WinForms 使用解决方案范围的资源

Use solution-wide resources with WinForms

我有一个 Visual Studio 2017 解决方案,它分为几个 C#-WinForm 应用程序。

为了拥有相似的用户界面,我将所有 icons/pictures 放入一个项目 (ResourceProject) 并标记资源文件 public.

通过直接编辑表单的 .Designer 文件,我现在可以通过声明

将图像显式分配给 ResourceProject 的资源文件中的内容
button1.Image = ResourceProject.Properties.Resources.DemoPic

然而,设计者有时会用

覆盖它
button1.Image = ((System.Drawing.Image)resources.GetObject("button1.Image")));

并创建一个本地资源文件,其中嵌入了图像。

这正是我一开始就想避免的,因为我可能想稍后轻松更改一些图标,并将这些更改直接传播到所有项目。

避免它的唯一方法似乎是不在 Designer 文件中分配图像,而是在实际表单文件中以其他方法分配图像。

有没有其他办法解决这个问题?

您不应该更改 designer.cs 文件,它是自动生成的,您在文件中所做的任何更改都将在您下次更改表单中的内容时被自动生成的代码替换。

但要在具有设计时支持的解决方案中的多个项目之间共享图像资源,您可以按照以下步骤操作:

  1. 创建一个class库项目,我们称它为ResourceLibrary
  2. Resx 资源文件添加到项目的根文件夹中,名称为 Resources.Resx
  3. 打开资源设计器并将其访问修饰符更改为Public。 (它将其 自定义工具 设置为 PublicResXFileCodeGenerator
  4. 在资源设计器中添加几张图片并保存。

然后在Windows表单项目中做如下设置:

  1. 添加对 ResourceLibrary 的引用。
  2. 右键单击 windows 表单项目并选择 添加现有项目...
  3. 浏览至 ResourceLibrary 文件夹并选择 Resources.Resx 文件。
  4. 点击打开按钮的下拉箭头,选择添加为Link.
  5. Select Resource.Resx 已添加到 windows 表单项目并选择属性。
  6. 将其构建操作设置为None
  7. 将其自定义工具设置为类似None
  8. 的文本
  9. 将其自定义工具命名空间设置为其他程序集中资源的命名空间:ResourceLibrary.
  10. 重建项目。

然后,对于所有图像属性,您可以从 Select 资源 对话框的下拉列表中选择其他资源文件。代码生成将为 属性 生成正确的代码,并且您有一个正确的构建,它在设计时和 运行 时都按预期工作。

您可以在此处克隆或下载工作示例: