【问题标题】:How do I get the Windows Forms Designer to use resources from external assembly?如何让 Windows 窗体设计器使用来自外部程序集的资源?
【发布时间】:2010-09-01 14:50:36
【问题描述】:

我在 Windows 窗体项目中的控件上使用的资源文件中有一些资源(在本例中为图像)。 Visual Studio 资源选择对话框对从资源文件中选择图像没有很好的支持,除非它们位于特定位置,但您可以直接编辑设计器文件,这样就可以了;应用程序可以正确编译和运行,而且 Windows 窗体设计器足够智能,不会弄乱我手工编辑的代码。

// in an assembly named ResourceConsumer
this.button1.Image = global::ResourceConsumer.Properties.Resources.Close32x32;

现在我想将这些资源移动到外部程序集,以便它们可以被多个应用程序使用。我可以设置一个程序集以毫无问题地公开其资源(只要我使用的是 Visual Studio 2008 或更高版本),这工作正常。当我更改设计器代码以从其新位置引用图像时,代码编译并正确运行,但现在 Windows 窗体设计器在生成代码时更改我的代码;它将图像的二进制文件嵌入到本地资源文件中并从那里引用它。

// ResourceProducer is an external assembly containing resources
this.button1.Image = global::ResourceProducer.Properties.Resources.Exit32x32;

由 Windows 窗体设计器更改为:

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

Windows 窗体设计器似乎理解从同一个程序集中提取资源,而不是从外部提取资源。有什么方法可以让 Windows 窗体设计器允许我使用来自外部程序集的资源?

【问题讨论】:

    标签: visual-studio winforms resources windows-forms-designer


    【解决方案1】:

    我有确切的same problem 并且可能有另一种方法,具体取决于您的代码库。如果已修改以引用特定资源的属性位于自定义控件上,则您可以将 [[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] 属性添加到这些属性(如果需要,覆盖或隐藏它们),Designer 将不理会它们。

    但是,如果属性位于基本 UI 元素(例如 Form.BackgroundImage)上,那么您也必须覆盖或隐藏这些属性,我不确定这是多么理想。

    【讨论】:

      【解决方案2】:

      不,设计师不支持这一点。重要的是,它以它的方式工作,否则通过附属程序集进行本地化将无法工作。

      您可以这样做,但您必须自己编写代码。几乎可以在 Resources.Designer.cs 文件中找到。请考虑这是否值得付出努力,它不是很可维护,并且共享资源程序集并不是什么优化。一个 TB 的磁盘不到一百美元。

      顺便说一句:从不自己编辑 Resources.Designer.cs 文件。

      【讨论】:

      • 确实,我一直无法找到让设计人员支持这一点的方法,但是当您说“通过附属程序集进行本地化不起作用”时,您是什么意思?我们希望整合资源以减少代码重复和本地化工作;一次包含和本地化资源会更容易,而不是在每个需要它的项目中。在这种情况下,不会根据资源程序集的附属程序集来检索本地化的资源吗?如果是这样,我们仍然可以将资源组合用于不需要设计师支持的项目。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多