.NET WinForms应用程序的图形模板化

9
我为我的公司创造了一个相当花哨的WinForms应用程序。我们有一个图形设计师创建了GUI,实现起来很麻烦,有许多图形按钮、许多分层的背景和标志、动画等。
但是现在我的公司想要在不同品牌下进行再销售。由于我大部分代码都写得很好,我告诉上级我可以在一周内做出完全重新品牌过的版本。基本上,我只需要在xml设置文件中更改一堆设置,用新的图形集替换原来的图形,然后构建即可。
问题是如果他们想要5或6个不同品牌,我将不得不支持5个不同的构建(实际上我应该只支持1个,使用不同的模板)。
问题在于,对于WinForms应用程序来说,不容易(据我所知)交换图像。我把所有的图形资源放在一个文件夹里,但是一旦每个文件被输入到其相应的图像列表或容器中,在Visual Studio中更新它的唯一方法是将其删除并重新添加,更改源文件夹不会导致嵌入式图像刷新。对于每个构建,这将非常繁琐,必须有更简单的方法。
补充:经过进一步调查,我倾向于某种resx文件编辑器。然而,我看到的那些更侧重于将字符串翻译成各种语言,并且要么非常薄弱,要么根本无法编辑二进制资源,如位图/ png等。但是如果您在xml查看器中打开一个resx文件(我使用带有.resx设置为使用xml语法高亮显示的notepad2),Microsoft会非常友好地告诉您每种类型是如何编译的(大多是base64的变体)。

2
太遗憾了,你正在使用WinForms,如果用WPF的话这将会非常简单。 - Muad'Dib
该应用程序于一年多前启动,使用了许多从我们几乎4年前创建的版本中导入的代码。不幸的是,我看不到我们这次会转向WPF。 - Neil N
5个回答

12

我认为您的目标应该是拥有“可品牌化”的资源文件;实质上,您正在本地化您的应用程序,只不过您有几个不同版本的英语。

您可以使用ResGen.exe和ResourceManager加载外部资源文件,因此您可以使用5个不同的“资源”文件,但保持代码库不变。

这篇文章也可能有所帮助... http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/b388c700-0e07-452b-a19e-ce02775f78a6/

编辑:顺便说一下,如果您要花费大量精力进行此操作,请考虑使用WPF...大多数这些“图形”元素可能可以通过本机方式完成,特别是如果涉及到渐变等内容,更不用提容易的模板化了。


除了WPF,我不确定这是否是我要找的,因为我仍然需要将每个图像单独添加到备用资源文件中吗?我希望让平面设计师修改文件夹中的所有图像,然后在构建之前将该文件夹替换为当前的文件夹。 - Neil N

0

现在已经太晚了,但是WPF比WinForms更好的选择,因为它更容易进行皮肤定制。

不过你可以看看DevExpress为WinForms所做的工作,因为他们的控件有一个皮肤系统。将DevExpress Winform控件替换为标准Winform控件并不太难。


0
我会在启动时从文件夹中加载磁盘上的所有图形,并根据需要创建任何所需的imagelist,而不是在设计师中这样做。如果您担心有人会窃取图形,则我会为我的图形创建一个简单的文件格式(可能是加密的),并为您或设计师创建一个小型简单应用程序,以将常规文件转换为此格式。然后只需要在不同品牌之间交换此文件夹即可。

0
如果您的大多数表单相似(即具有相同的徽标、底部相同的按钮等),则可以在WinForms上使用可视化继承来定义一组“基本表单”,从而使您的实际表单继承。
如果您为每个品牌开发了一组“基本表单”,每个集合都在单独的程序集中,那么插入所需的工作以生成新品牌的工作量就减少到生成新的一组基本表单。
希望这有所帮助。

-2

我认为你应该考虑为表单中可动态替换的区域创建用户控件。在运行时,你可以将一个程序集替换为另一个程序集。


这是一个可怕的想法。一切都是图形化的。我想把代码放在一个地方。为每个构建创建新的程序集会让我比现在更糟糕。 - Neil N
我以为你指的是页眉图片。我建议你创建一个单独的用户控件,其中包含嵌入资源的图像,然后在运行时动态加载相应的控件。每个品牌都有自己的页眉程序集。如果你的图像散落在各处,那么这不是正确的方法。 - rp.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接