将WinForms.Form的alread构建实例序列化为VB或C#源代码,就像IDE一样
我有大约500个WinForms,它们是由一个旧应用程序从XML文件动态生成的。我想自动将这些转换为VB或C代码,我可以在设计器中编辑 我可以用手做这件事,这要花很长时间 或者编写一个应用程序,加载每个XML,将旧应用程序的XML调用到winform builder,将其转换为完整的winform,检查每个控件的属性,并使用StringBuilder生成设计器将吞下的代码。这充其量也很艰难 但是:我想使用设计师使用的代码。我想这会节省我处理街角案件的时间 我想做的是,以一个已经构建的WinForm对象为例,该对象的控件数组中充满了子控件(由旧的apps xml to WinForm代码创建),将它扔到IDE用于将设计的表单序列化为CodeDom的同一代码中,然后返回一个我可以用真实语言保存的语句的CodeDom列表。一旦我拿到密码,我会很高兴的 编辑将WinForms.Form的alread构建实例序列化为VB或C#源代码,就像IDE一样,c#,vb.net,codedom,design-surface,C#,Vb.net,Codedom,Design Surface,我有大约500个WinForms,它们是由一个旧应用程序从XML文件动态生成的。我想自动将这些转换为VB或C代码,我可以在设计器中编辑 我可以用手做这件事,这要花很长时间 或者编写一个应用程序,加载每个XML,将旧应用程序的XML调用到winform builder,将其转换为完整的winform,检查每个控件的属性,并使用StringBuilder生成设计器将吞下的代码。这充其量也很艰难 但是:我想使用设计师使用的代码。我想这会节省我处理街角案件的时间 我想做的是,以一个已经构建的WinFor
这篇文章体现了我想要做的“概念”:从一个完整的表单开始,将其转换为代码(“序列化”)。但是,它有两个缺点:(1)它使用templates/stringbuilder生成.aspx页面,这就是属性所在的位置(对于webforms很好,但是winforms将属性序列化到实际的.Designer.vb文件中);(2) 这一切都是从头开始的。我想重新使用VisualStudio的例程。它们可以让您在很多事情上做到这一点,例如,属性网格。我只是在寻找一篇文章的链接(可能是我的google fu太弱了),或者是某个人已经做过的某件事的简短代码示例。所以这可能适合您的需要,也可能不适合您的需要。我有一个解决方案,但需要调整XML->WinForms呈现 这在很大程度上依赖于本项目的使用: 下载EXE(它只是源代码的压缩版本,带有EULA)并构建解决方案。在删除对图形库的引用(以及从主机库对其进行的相关调用)之前,我在构建过程中遇到了一些问题。为什么主机库需要绘制图形我不太确定 然后,我构建了一个新的WinForms项目(由于DesignSurface无法挂接到拖放事件中,因此无法作为控制台)。在新的winforms项目中引用上述项目中的主机和加载程序项目 在这里,您无疑需要调整现有流程。合并现有流程,使其适合以下我的标签所示的这种类型的表单构建:
HostSurfaceManager hsm = new HostSurfaceManager();
HostControl hc = hsm.GetNewHost(typeof(Form), LoaderType.CodeDomDesignerLoader);
var l = new Label() { Text = "TEST!!!!" };
hc.DesignerHost.Container.Add(l);
richTextBox1.Text = ((CodeDomHostLoader)hc.HostSurface.Loader).GetCode("C#");
这将生成form.cs文件内容(请参见下面生成的代码)。这是一个多功能文件,您不需要创建单独的form.cs.designer文件来获得设计器支持。我复制了上面生成的代码,将其保存到一个.cs文件中,VisualStudio将其识别为winform并为我提供了设计支持
您的副本可能会包含一个子集管。我进入Loader->CodeGen.cs文件并注释掉了与Main相关的部分,我建议您也这样做
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:2.0.50727.5448
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace DesignerHostSample
{
using System;
using System.ComponentModel;
using System.Windows.Forms;
public class Form1 : System.Windows.Forms.Form
{
private System.Windows.Forms.Label label1;
public Form1()
{
this.InitializeComponent();
}
private void InitializeComponent()
{
this.label1 = new System.Windows.Forms.Label();
this.SuspendLayout();
//
// label1
//
this.label1.Location = new System.Drawing.Point(0, 0);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(100, 23);
this.label1.TabIndex = 0;
this.label1.Text = "TEST!!!!";
//
// Form1
//
this.ClientSize = new System.Drawing.Size(284, 262);
this.Name = "Form1";
this.ResumeLayout(false);
}
}
}
为什么要多走一步?为什么不直接将xml转换为c#/vb?讨论中的IDE是Visual Studio,实现设计器的大多数代码要么是本机代码(根本不可重用),要么是.NET代码,但在私有程序集或私有/内部类中实现。为了确保我的回答正确:您有大量使用xml定义的表单,您拥有将此XML转换为WinForms对象的代码。现在,您想采用这个过程,它可以使用XML模板自动生成WinForms,并将其全部硬编码,但需要设计器支持吗?您希望通过设计师支持获得什么?您是否计划放弃xml模板解决方案?@Tommy-当前系统可以处理xml文件,但是编辑是一件痛苦的事情。我必须手工做。比如在记事本中制作HTML表单。想要转换成代码,这样我就可以使用IDE的winforms编辑器进行拖放操作(这里是90年代)。@Peter-“我希望获得什么”-使用IDE的winforms设计器编辑表单设计的能力。现在就像用记事本制作HTML表单一样。这样,我就不必为适当的格式编写编辑器。转换为HTML并使用HTML编辑器将允许更改视觉效果,但不允许数据绑定等,这是WinForms extra。我已经有了一个转换器,可以将我正在设计的新屏幕转换成XML。@FastAI-很高兴我能帮你实现它。因为我只是为你写了这篇文章,所以我没有办法真正解决这些问题,所以谢谢你发布你的修订。