亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

C#利用DesignSurface如何實現簡單的窗體設計器

2019-10-29 21:13:10
字體:
來源:轉載
供稿:網友

code>System.ComponentModel.Design.DesignSurface是為設計組件提供一個用戶界面,通過它可以實現一個簡單的窗體設計器。

在構建之前,我們需要引入System.Design.dll,否則會出現找不到DesignSurface的錯誤。

designsurface,c,開發窗體設計器,窗體設計

private void Form1_Load(object sender, EventArgs e) {  //引用System.Deisgn.dll  DesignSurface ds = new DesignSurface();  //開始加載窗體  ds.BeginLoad(typeof(Form));  Control designerContorl = (Control)ds.View;  designerContorl.Dock = DockStyle.Fill;  this.Controls.Add(designerContorl); }

運行后出現簡單的一個UI設計器

designsurface,c,開發窗體設計器,窗體設計

但是該設計器并不能實現控件拖放和UI設計器,以及控件的屬性配置。

為了支持從源代碼加載初始化窗體,需要對源碼中的相關方法進行解析,這里我們 CodeDomDesignerLoader來實現定制化業務,CodeDomDesignerLoader是提供用于實現基于 CodeDOM 的設計器加載程序的基類。

繼承它的類需要重寫CodeCompileUnit Parse()方法,來實現加載窗體:

protected override CodeCompileUnit Parse() {    #region 源文件讀取  var sw = new StreamReader(@"E:/FrmUser.cs");  var sw_designer = new StreamReader(@"E:/FrmUser.Designer.cs");  string formCodeCS = sw.ReadToEnd();  string formCodeDesigner = sw_designer.ReadToEnd();  List<string> source = new List<string>();  source.Add(formCodeCS);  source.Add(formCodeDesigner);  #endregion  //Rolsyn解析C#  var rootDesigner = Source2CodeDom.Parse(formCodeDesigner);  codeDesingerCompileUnit = Source2CodeDom.GetDesignerCodeComplieUnit(rootDesigner);  var rootCS = Source2CodeDom.Parse(formCodeCS);  codeCSCompileUnit = Source2CodeDom.GetCodeComplieUnit(rootCS);  //MergeFormSource  string mergeS = Source2CodeDom.MergeFormSource(formCodeDesigner, formCodeCS);  codeMergeCompileUnit = Source2CodeDom.GetMergeDesignerCodeComplieUnit(mergeS);  return codeMergeCompileUnit;

解析的方法如下,但是此解析只是用于代碼的生成,并不能用戶UI界面的顯示:

public static CodeCompileUnit GetDesignerCodeComplieUnit2(CompilationUnitSyntax root) {  CodeCompileUnit ccu = new CodeCompileUnit();  var firstMember = root.Members[0];  var namespaceDeclration = (NamespaceDeclarationSyntax)firstMember;  var designClassDeclaration = (ClassDeclarationSyntax)namespaceDeclration.Members[0];  var myDesignerClass = new CodeTypeDeclaration(designClassDeclaration.Identifier.ToString());  var initializeComponent = new CodeMemberMethod();  var ns = new CodeNamespace(namespaceDeclration.Name.ToString());  foreach (var m in designClassDeclaration.Members)  {  if (m is ConstructorDeclarationSyntax)  {   var ctor = ((ConstructorDeclarationSyntax)m);   var codeBody = ctor.Body.ToString();   codeBody = codeBody.Trim().TrimStart('{').TrimEnd('}').Trim().TrimEnd(';');   CodeSnippetExpression csbody = new CodeSnippetExpression(codeBody);   CodeExpressionStatement stmt = new CodeExpressionStatement(csbody);   //Add the expression statements to the method.   // InitializeComponent   var cctor = new CodeConstructor();   cctor.Name = ctor.Identifier.ToString();   //var cmm = new CodeMemberMethod();   //cmm.Name = ctor.Identifier.ToString();   //cmm.Attributes = GetCtoRAttrMapping(ctor);   //cmm.ReturnType = new CodeTypeReference(typeof(void));   cctor.Statements.Add(stmt);   myDesignerClass.Members.Add(cctor);  }  if (m is FieldDeclarationSyntax)  {   var F = ((FieldDeclarationSyntax)m);   var type = F.Declaration.Type;   foreach (var variable in F.Declaration.Variables)   {   var field = new CodeMemberField();   field.Name = variable.Identifier.ToString();   field.Type = new CodeTypeReference(type.ToString());   field.Attributes = GetFieldAttrMapping(F);   //field.InitExpression = new CodePrimitiveExpression(null);   myDesignerClass.Members.Add(field);   }  }  if (m is MethodDeclarationSyntax)  {   var node = m as MethodDeclarationSyntax;   #region xml comments   var xmlTrivia = node.GetLeadingTrivia()   .Select(i => i.GetStructure())   .OfType<DocumentationCommentTriviaSyntax>()   .FirstOrDefault();    #endregion   var method = (MethodDeclarationSyntax)m;   var cmm = new CodeMemberMethod();   cmm.Name = method.Identifier.ToString();   ///XML注釋   string[] comments = xmlTrivia.ToString().Split("/r/n".ToCharArray());   foreach (string text in comments)   {   if (text.Trim() != "")   {    cmm.Comments.Add(new CodeCommentStatement(text.Trim().TrimStart("///".ToCharArray()).Trim(), true));   }   }   if (cmm.Name == "InitializeComponent")   {   //region    CodeRegionDirective codeRegion = new CodeRegionDirective(CodeRegionMode.Start, "Windows 窗體設計器生成的代碼");   CodeRegionDirective codeEndRegion = new CodeRegionDirective(CodeRegionMode.End, "");   cmm.StartDirectives.Add(codeRegion);   cmm.EndDirectives.Add(codeEndRegion);   }   //MemberAttributes.Family is protected   //cmm.Attributes = MemberAttributes.Override | MemberAttributes.Family;   cmm.Attributes = GetMethodAttrMapping(method);   cmm.ReturnType = new CodeTypeReference(method.ReturnType.ToString());   foreach (var p in method.ParameterList.Parameters)   {   CodeParameterDeclarationExpression cpd = new CodeParameterDeclarationExpression();   cpd.Name = p.Identifier.ToString();   cpd.Type = new CodeTypeReference(p.Type.ToString());   cmm.Parameters.Add(cpd);   }   //包含方法{};,會重復生成{};   string codeBody = method.Body.ToString();   codeBody = codeBody.Trim().TrimStart('{').TrimEnd('}').Trim().TrimEnd(';');   if (codeBody != "")   {   CodeSnippetExpression csbody = new CodeSnippetExpression(codeBody);   CodeExpressionStatement stmt = new CodeExpressionStatement(csbody);   //Add the expression statements to the method.   cmm.Statements.Add(stmt);   }   myDesignerClass.Members.Add(cmm);  }  if (m is MemberDeclarationSyntax)  {  }  }  ccu.Namespaces.Add(ns);  //Partial Class  myDesignerClass.IsPartial = true;   ns.Types.Add(myDesignerClass);    return ccu; }

窗體的顯示,需要逐句進行C#解析,特別是InitializeComponent()方法。

designsurface,c,開發窗體設計器,窗體設計

designsurface,c,開發窗體設計器,窗體設計

.CS Code其實最簡單的就是讀取源代碼,然后返回就可以了。當設計器添加控件或者綁定事件時,可以通過文本操作進行代碼完善。

 //直接返回代碼,最簡單 public string GetTextCSCode() { Flush(); return __CSTextCode; }

CodeDomHostLoader類中有OnComponentRename,在設計器重命名組件時候響應,這里可以修復后臺.cs中的控件引用

designsurface,c,開發窗體設計器,窗體設計

designsurface,c,開發窗體設計器,窗體設計

 designsurface,c,開發窗體設計器,窗體設計

但此設計器還有很多不完善的地方,后期有時間再完善吧。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流。

 

注:相關教程知識閱讀請移步到c#教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美激情一区二区三级高清视频| 欧美成人午夜免费视在线看片| 国产视频久久网| 欧美日韩另类视频| 美日韩精品免费观看视频| 国产中文字幕亚洲| 久热精品在线视频| 国产女同一区二区| 国产一区二区精品丝袜| 日韩成人在线观看| 欧美大片在线影院| 国产午夜精品久久久| 亚洲色图狂野欧美| 日韩欧美在线中文字幕| 7777精品视频| 亚洲精品视频免费| 色七七影院综合| 日韩国产激情在线| 亚洲人成在线观看| 成人网中文字幕| 欧美视频二区36p| 亚洲第一色在线| 亚洲欧洲国产精品| 久久婷婷国产麻豆91天堂| 国产精品九九久久久久久久| 亚洲影院污污.| 欧美日韩一区二区免费视频| 国产精品激情自拍| 国产在线精品成人一区二区三区| 国产精品视频久久| 色悠悠国产精品| 国产欧美日韩免费看aⅴ视频| 国产精品久久久久久久久久三级| 日韩av在线一区二区| 日韩在线观看av| 国产精品av网站| 中文字幕亚洲无线码a| 国产精品女人久久久久久| 国产成人精品免高潮费视频| 欧美极品美女电影一区| 亚洲图片欧美午夜| 亚洲欧美日韩精品久久| 日韩风俗一区 二区| 精品国产一区二区三区在线观看| 日韩电影在线观看免费| 欧美精品videossex88| 欧美另类暴力丝袜| 亚洲精品福利资源站| 久久精品成人欧美大片| 精品欧美国产一区二区三区| 亚洲日韩中文字幕在线播放| 国模gogo一区二区大胆私拍| 日韩精品免费在线视频| 日日狠狠久久偷偷四色综合免费| 一级做a爰片久久毛片美女图片| 亚洲成色777777在线观看影院| 色悠悠久久88| 91精品国产电影| 午夜欧美不卡精品aaaaa| 精品福利一区二区| 国产精品一区=区| 成人午夜黄色影院| 国模极品一区二区三区| 最近中文字幕mv在线一区二区三区四区| 97视频在线观看网址| 国产精品自拍小视频| 亚洲欧洲高清在线| 最近2019中文字幕大全第二页| 免费91麻豆精品国产自产在线观看| 国产免费成人av| 欧美体内谢she精2性欧美| 国产精品久久久久久久久久小说| 亚洲欧洲日产国产网站| 欧美成人精品影院| 亚洲电影成人av99爱色| 免费不卡在线观看av| 国产91亚洲精品| 亚洲国产精品一区二区三区| 亚洲黄页视频免费观看| 日本韩国欧美精品大片卡二| 在线视频一区二区| 亚洲四色影视在线观看| 日韩av在线一区二区| 福利二区91精品bt7086| 久久久精品亚洲| 国产精品pans私拍| 亚洲国产欧美一区二区三区同亚洲| 久久久噜噜噜久久久| 国产精品久久久久久久久久| 国产香蕉精品视频一区二区三区| 精品久久久91| 欧美成人免费观看| 亚洲欧美一区二区三区四区| 日韩电视剧免费观看网站| 亚洲级视频在线观看免费1级| 综合网中文字幕| 亚洲精品久久久久| 午夜精品久久久久久久男人的天堂| 欧洲成人免费视频| 国产一区二区三区在线免费观看| 爱福利视频一区| 色综合视频网站| 欧美性生交xxxxx久久久| 欧美电影免费观看网站| 欧美激情视频免费观看| 欧美性色视频在线| 91久久国产精品91久久性色| 日韩美女免费观看| 精品亚洲一区二区三区| 国产在线一区二区三区| 日韩动漫免费观看电视剧高清| 亚洲视频欧洲视频| 国产精品偷伦视频免费观看国产| 午夜精品久久久久久久99黑人| 精品中文字幕在线观看| 久久精品国产精品| 久久久久久久爱| 欧美一区二区视频97| 国产精品视频自在线| 日韩av最新在线| 亚洲va久久久噜噜噜| 欧美区二区三区| 亚洲伊人一本大道中文字幕| 国内久久久精品| 欧美国产日本在线| 欧美孕妇孕交黑巨大网站| 国产成人高潮免费观看精品| 国产精品99免视看9| 91在线观看免费观看| 91网站在线免费观看| 欧美精品18videosex性欧美| 国产日韩欧美夫妻视频在线观看| 亚洲欧美国内爽妇网| 国产欧美日韩91| 精品国内自产拍在线观看| 欧美激情综合色| 亚洲电影免费观看高清完整版| 性色av一区二区三区在线观看| 日韩在线播放视频| 日本国产精品视频| 26uuu亚洲伊人春色| 国产91ⅴ在线精品免费观看| 国产精品美乳在线观看| 日本精品一区二区三区在线播放视频| 日本午夜人人精品| 永久555www成人免费| 2020国产精品视频| 中文字幕一区电影| 精品久久久91| 国产精品678| 92版电视剧仙鹤神针在线观看| 久久精品中文字幕免费mv| 日韩欧美黄色动漫| 欧美精品久久久久| 欧美亚洲国产另类| 亚洲一区二区三区sesese| 欧美日韩在线观看视频| 国产精品色午夜在线观看| 久久人人爽人人爽人人片av高请| 日本中文字幕成人| 久久香蕉国产线看观看网| 国产欧美亚洲精品| 亚洲精品国产精品国产自| 亚洲一区二区三区xxx视频|