标签:private 用户
System.ComponentModel.Design.DesignSurface是为设计组件提供一个用户界面,通过它可以实现一个简单的窗体设计器。
在构建之前,我们需要引入System.Design.dll,否则会出现找不到DesignSurface的错误。
1 private void Form1_Load(object sender, EventArgs e) 2 { 3 //引用System.Deisgn.dll 4 DesignSurface ds = new DesignSurface(); 5 //开始加载窗体 6 ds.BeginLoad(typeof(Form)); 7 Control designerContorl = (Control)ds.View; 8 designerContorl.Dock = DockStyle.Fill; 9 this.Controls.Add(designerContorl);10 }运行后出现简单的一个UI设计器
但是该设计器并不能实现控件拖放和UI设计器,以及控件的属性配置。
为了支持从源代码加载初始化窗体,需要对源码中的相关方法进行解析,这里我们 CodeDomDesignerLoader来实现定制化业务,CodeDomDesignerLoader是提供用于实现基于 CodeDOM 的设计器加载程序的基类。
继承它的类需要重写CodeCompileUnit Parse()方法,来实现加载窗体:
1 protected override CodeCompileUnit Parse() 2 { 3 4 #region 源文件读取 5 var sw = new StreamReader(@"E:\FrmUser.cs"); 6 var sw_designer = new StreamReader(@"E:\FrmUser.Designer.cs"); 7 8 string formCodeCS = sw.ReadToEnd(); 9 string formCodeDesigner = sw_designer.ReadToEnd();10 11 List<string> source = new List<string>();12 source.Add(formCodeCS);13 source.Add(formCodeDesigner);14 15 #endregion16 //Rolsyn解析C#17 var rootDesigner = Source2CodeDom.Parse(formCodeDesigner);18 codeDesingerCompileUnit = Source2CodeDom.GetDesignerCodeComplieUnit(rootDesigner);19 var rootCS = Source2CodeDom.Parse(formCodeCS);20 codeCSCompileUnit = Source2CodeDom.GetCodeComplieUnit(rootCS);21 //MergeFormSource22 string mergeS = Source2CodeDom.MergeFormSource(formCodeDesigner, formCodeCS);23 codeMergeCompileUnit = Source2CodeDom.GetMergeDesignerCodeComplieUnit(mergeS);24 return codeMergeCompileUnit;解析的方法如下,但是此解析只是用于代码的生成,并不能用户UI界面的显示: