c# - 通过 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 文件中分配图像,而是在实际表单文件中以其他方法分配图像。
有没有其他方法可以解决这个问题?
解决方案
您不应该更改 Designer.cs 文件,它是自动生成的,并且您在文件中所做的任何更改都将在您下次更改表单中的某些内容时替换为自动生成的代码。
但是要在具有设计时支持的解决方案中的多个项目之间共享图像资源,您可以按照以下步骤操作:
- 创建一个类库项目,我们称之为
ResourceLibrary
. - 使用此名称将资源文件添加
Resx
到项目的根文件夹Resources.Resx
。 - 打开资源设计器并将其访问修饰符更改为
Public
. (它将其自定义工具设置为PublicResXFileCodeGenerator
) - 将一些图像添加到资源设计器并保存。
然后在 Windows 窗体项目中进行以下设置:
- 添加对
ResourceLibrary
. - 右键单击 windows 窗体项目并选择添加→现有项目...
- 浏览到
ResourceLibrary
文件夹并选择Resources.Resx
文件。 - 单击“打开”按钮的下拉箭头,然后选择“添加为链接”。
- 选择
Resource.Resx
已添加到 windows 窗体项目并选择属性。 - 将其构建操作设置为
None
- 将其自定义工具设置为类似的文本
None
- 将其自定义工具命名空间设置为其他程序集中资源的命名空间:
ResourceLibrary
. - 重建项目。
然后对于所有图像属性,您可以从“选择资源”对话框的下拉列表中选择其他资源文件。代码生成将为属性生成正确的代码,并且您拥有正确的构建,并且它在设计时和运行时都按预期工作。
您可以在此处克隆或下载一个工作示例:
推荐阅读
- javascript - 在 mongoDB 和 Angular 中实现 socket.io 会引发错误 Cannot GET /socket.io/
- c# - 浏览器意外刷新时的 Blazor WebAssembly 生命周期方法
- spring-boot - 是否可以告诉 spring cloud sleuth 不记录密码等值?
- reactjs - PDFTron 中的滚动页面
- google-sheets - 将 2 个 REGEXREPLACE 公式合二为一
- matlab - 为反相流创建方程矩阵
- javascript - 如何通过比较 JavaScript 中的两个字符串从字符串中获取一个值?
- python - 为什么 subprocess 不会仅以 Python 2.7 终止?
- android - Google Play 控制台 - Android Bundle 权限问题
- mongodb - Javers 异步提交到 Mongo DB