【问题标题】:Use solution-wide resources with WinForms通过 WinForms 使用解决方案范围的资源
【发布时间】:2019-12-26 18:23:22
【问题描述】:

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

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

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

button1.Image = ResourceProject.Properties.Resources.DemoPic

但是,设计师有时会用

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

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

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

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

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

【问题讨论】:

  • 您确实需要避免接触表单的设计器:这不是您的事。如果您使用不直接属于项目的资源,请避免使用 PropertyGrid。在 Form 的构造函数中分配共享资源。构建仅资源 dll 是另一种选择。
  • 当分配在设计时运行时也可能发生这种情况。使用 DesignMode 属性阻止它执行。
  • 您不应该更改 Designer.cs 文件,它是自动生成的,并且您在该文件中所做的任何更改都将在您下次更改表单中的某些内容时替换为自动生成的代码。
  • 按照我在答案中分享的步骤,可以在不更改设计器文件的情况下共享设计时支持的资源。

标签: c# .net winforms windows-forms-designer embedded-resource


【解决方案1】:

您不应该更改 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. 重建项目。

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

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

【讨论】:

  • 令人印象深刻,它确实有效,非常感谢!注意:资源文件位于 ResourceLibrary-project 的根文件夹中,而不是具有子命名空间的子文件夹中,这似乎很重要。否则,设计器中的命名空间将无法正确设置。
  • 不客气。如果您在ResourceLibrary 项目中将Resource1.resx 添加到Folder1,那么您仍然可以将Resource1.resx 的链接添加到Windows 窗体项目的根目录,只需确保在您的Windows 窗体项目中设置链接的Custom Tool NamespaceResourceLibrary.Folder1
猜你喜欢
  • 2011-07-06
  • 2011-03-10
  • 2011-02-04
  • 2014-02-04
  • 1970-01-01
  • 2012-07-31
  • 2018-06-04
  • 1970-01-01
  • 2011-01-18
相关资源
最近更新 更多