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

首頁 > 編程 > C# > 正文

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

2020-01-24 00:44:31
字體:
來源:轉載
供稿:網友

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

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

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設計器

但是該設計器并不能實現控件拖放和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("http:///".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()方法。

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

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

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

 

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

總結

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
不卡av在线播放| 91欧美激情另类亚洲| 久久久久久国产精品美女| 亚洲精品综合久久中文字幕| 成人亚洲激情网| 国产精品激情自拍| 亚洲理论在线a中文字幕| 亚洲精品视频在线播放| 色婷婷综合久久久久中文字幕1| 成人免费午夜电影| 欧美亚洲成人网| 九九热精品在线| 中文字幕欧美在线| 国产精品日韩欧美| 国产精品久久久久久久久久久久久| 亚洲三级 欧美三级| 国产不卡av在线免费观看| 久久久久久尹人网香蕉| 欧美成人在线免费视频| 欧美精品18videos性欧| 亚洲精品美女在线观看| 久久久久久国产精品| 精品久久久久久电影| 亚洲国产一区自拍| 亚洲男人的天堂在线播放| 亚洲视频在线看| 91在线直播亚洲| 国内精品一区二区三区四区| 日韩欧美精品中文字幕| 国产精品视频男人的天堂| 日韩精品视频在线观看免费| 国产成人精品免高潮费视频| 日韩电影视频免费| 国产欧美日韩丝袜精品一区| 92福利视频午夜1000合集在线观看| 欧美精品成人在线| 国产91精品黑色丝袜高跟鞋| 欧美成年人视频网站| 欧美xxxx综合视频| 成人网中文字幕| 亚洲欧美日本精品| 国产精品99久久久久久久久久久久| 日韩视频―中文字幕| 欧美香蕉大胸在线视频观看| 国产精品中文字幕久久久| 亚洲视频国产视频| 欧美日韩国产丝袜另类| 欧美一区亚洲一区| 欧美日韩第一视频| 国产精品极品美女粉嫩高清在线| 久久久久久久久电影| 国产精品久久久久久超碰| 在线观看国产精品91| 欧美性生活大片免费观看网址| 亚洲美女动态图120秒| 久久久久成人精品| 日韩精品中文字| 最好看的2019的中文字幕视频| 91精品久久久久久久久久久久久| 亚洲精品资源美女情侣酒店| 亚洲美女性视频| 精品国产一区二区三区久久久狼| 亚洲精品视频免费| 久久这里只有精品视频首页| 亚洲高清av在线| 日韩欧美国产黄色| 亚洲欧美一区二区三区久久| 国产精品jizz在线观看麻豆| 国产在线日韩在线| 欧美亚洲国产精品| 91中文精品字幕在线视频| 国产z一区二区三区| 日韩欧美中文字幕在线播放| 久久久久国产一区二区三区| 国产精品手机播放| 俺去了亚洲欧美日韩| 中文字幕日韩高清| 欧美日韩一区二区三区| 亚洲午夜国产成人av电影男同| 国产精品久久久久秋霞鲁丝| 欧美国产日韩一区二区三区| 欧美亚洲国产视频| 久久久亚洲影院| 亚洲人成在线观| 国产69精品99久久久久久宅男| 亲子乱一区二区三区电影| 日韩视频欧美视频| 久久伊人色综合| 色狠狠av一区二区三区香蕉蜜桃| 国产精品日本精品| 高清欧美性猛交xxxx| 欧美日韩一二三四五区| 国产成人在线播放| 日韩国产高清视频在线| 欧美精品在线观看| 欧美性猛交xxxx富婆| 国产91精品最新在线播放| 国产男人精品视频| 亚洲白拍色综合图区| 欧美性一区二区三区| 国产美女精品视频免费观看| 亚洲午夜av久久乱码| 日韩av免费观影| 91成人精品网站| 丝袜美腿精品国产二区| 亚洲人成自拍网站| 综合av色偷偷网| 久久久久久久久电影| 久久久久亚洲精品国产| 久久久亚洲欧洲日产国码aⅴ| 国内成人精品视频| 欧美日韩激情小视频| 成人乱人伦精品视频在线观看| 欧美日韩国产精品一区二区三区四区| 色偷偷888欧美精品久久久| 国产91精品网站| 51色欧美片视频在线观看| 久久精品久久久久久国产 免费| 精品高清美女精品国产区| 亚洲综合色av| 成人免费淫片视频软件| 国产精品成熟老女人| 欧美视频在线观看免费| 成人做爽爽免费视频| 久久久久日韩精品久久久男男| 国产欧美一区二区三区久久| 日韩精品在线观| 成人xvideos免费视频| 欧美成人免费在线观看| 亚洲日韩欧美视频一区| 日韩免费av片在线观看| 97久久精品人搡人人玩| 中文欧美在线视频| 亚洲欧美成人一区二区在线电影| 亚洲视频一区二区| 精品欧美国产一区二区三区| 欧美综合在线观看| 北条麻妃久久精品| 清纯唯美亚洲激情| 136fldh精品导航福利| 91av国产在线| 欧美高清第一页| 亚洲精品免费一区二区三区| 欧美专区日韩视频| 亚洲美女在线观看| 成人免费视频网| 久久亚洲影音av资源网| 91精品免费久久久久久久久| 亚洲第一精品夜夜躁人人躁| 91香蕉国产在线观看| 日本精品视频网站| 欧美精品中文字幕一区| 国产日韩欧美综合| 国产日韩专区在线| 国产精品视频一区二区三区四| 国产精品毛片a∨一区二区三区|国| 中文字幕日韩高清| 91成人国产在线观看| 日韩暖暖在线视频| 国产亚洲视频在线| 自拍偷拍亚洲一区| 国产福利成人在线| 性色av香蕉一区二区| 亚洲精品国产suv|