如何让Windows窗体设计器使用外部程序集中的资源?

时间:2010-09-01 14:50:37

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

我在我的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窗体设计器允许我使用外部程序集中的资源?

2 个答案:

答案 0 :(得分:3)

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

但是,如果属性在基本的UI元素(例如Form.BackgroundImage)上,那么你必须也必须覆盖或隐藏它们,我不确定它是多么令人满意。

答案 1 :(得分:2)

不,设计师不支持这一点。重要的是它按照它的方式工作,通过附属组件进行本地化不会起作用。

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

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