Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将WinForms.Form的alread构建实例序列化为VB或C#源代码,就像IDE一样_C#_Vb.net_Codedom_Design Surface - Fatal编程技术网

将WinForms.Form的alread构建实例序列化为VB或C#源代码,就像IDE一样

将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

我有大约500个WinForms,它们是由一个旧应用程序从XML文件动态生成的。我想自动将这些转换为VB或C代码,我可以在设计器中编辑

我可以用手做这件事,这要花很长时间

或者编写一个应用程序,加载每个XML,将旧应用程序的XML调用到winform builder,将其转换为完整的winform,检查每个控件的属性,并使用StringBuilder生成设计器将吞下的代码。这充其量也很艰难

但是:我想使用设计师使用的代码。我想这会节省我处理街角案件的时间

我想做的是,以一个已经构建的WinForm对象为例,该对象的控件数组中充满了子控件(由旧的apps xml to WinForm代码创建),将它扔到IDE用于将设计的表单序列化为CodeDom的同一代码中,然后返回一个我可以用真实语言保存的语句的CodeDom列表。一旦我拿到密码,我会很高兴的

编辑
这篇文章体现了我想要做的“概念”:从一个完整的表单开始,将其转换为代码(“序列化”)。但是,它有两个缺点:(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-很高兴我能帮你实现它。因为我只是为你写了这篇文章,所以我没有办法真正解决这些问题,所以谢谢你发布你的修订。