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

问题描述

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

为了拥有类似的用户界面,我将所有图标/图片放入一个项目(ResourceProject)并将资源文件标记为公开。

通过直接编辑表单的 .Designer 文件,我现在可以通过声明将图像显式分配给 ResourceProject 的资源文件中的某些内容

button1.Image = ResourceProject.Properties.Resources.DemoPic

然而,设计师有时会用

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

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

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

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

有没有其他方法可以解决这个问题?

标签: c#.netwinformswindows-forms-designerembedded-resource

解决方案


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

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

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

然后在 Windows 窗体项目中进行以下设置:

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

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

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


推荐阅读