最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#利用DesignSurface如何實(shí)現(xiàn)簡(jiǎn)單的窗體設(shè)計(jì)器

 更新時(shí)間:2017年02月25日 16:09:06   作者:JackWang-CUMT  
這篇文章主要介紹了C#利用DesignSurface如何實(shí)現(xiàn)簡(jiǎn)單窗體設(shè)計(jì)器的相關(guān)資料,文中通過(guò)圖文及示例代碼介紹的很詳細(xì),對(duì)大家具有一定的參考價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。

System.ComponentModel.Design.DesignSurface是為設(shè)計(jì)組件提供一個(gè)用戶界面,通過(guò)它可以實(shí)現(xiàn)一個(gè)簡(jiǎn)單的窗體設(shè)計(jì)器。

在構(gòu)建之前,我們需要引入System.Design.dll,否則會(huì)出現(xiàn)找不到DesignSurface的錯(cuò)誤。

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);
 }

運(yùn)行后出現(xiàn)簡(jiǎn)單的一個(gè)UI設(shè)計(jì)器

但是該設(shè)計(jì)器并不能實(shí)現(xiàn)控件拖放和UI設(shè)計(jì)器,以及控件的屬性配置。

為了支持從源代碼加載初始化窗體,需要對(duì)源碼中的相關(guān)方法進(jìn)行解析,這里我們 CodeDomDesignerLoader來(lái)實(shí)現(xiàn)定制化業(yè)務(wù),CodeDomDesignerLoader是提供用于實(shí)現(xiàn)基于 CodeDOM 的設(shè)計(jì)器加載程序的基類。

繼承它的類需要重寫CodeCompileUnit Parse()方法,來(lái)實(shí)現(xiàn)加載窗體:

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 窗體設(shè)計(jì)器生成的代碼");
   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);
   }
   //包含方法{};,會(huì)重復(fù)生成{};
   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;
 }

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

.CS Code其實(shí)最簡(jiǎn)單的就是讀取源代碼,然后返回就可以了。當(dāng)設(shè)計(jì)器添加控件或者綁定事件時(shí),可以通過(guò)文本操作進(jìn)行代碼完善。

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

CodeDomHostLoader類中有OnComponentRename,在設(shè)計(jì)器重命名組件時(shí)候響應(yīng),這里可以修復(fù)后臺(tái).cs中的控件引用

 

但此設(shè)計(jì)器還有很多不完善的地方,后期有時(shí)間再完善吧。

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,如果有疑問(wèn)大家可以留言交流。

相關(guān)文章

  • C#計(jì)算2個(gè)字符串的相似度

    C#計(jì)算2個(gè)字符串的相似度

    這篇文章主要為大家詳細(xì)介紹了C#計(jì)算2個(gè)字符串相似度的相關(guān)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • unity實(shí)現(xiàn)虛擬搖桿控制Virtual Joystick

    unity實(shí)現(xiàn)虛擬搖桿控制Virtual Joystick

    這篇文章主要為大家詳細(xì)介紹了unity實(shí)現(xiàn)虛擬搖桿控制Virtual Joystick,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • c#一個(gè)定時(shí)重啟的小程序?qū)崿F(xiàn)代碼

    c#一個(gè)定時(shí)重啟的小程序?qū)崿F(xiàn)代碼

    今天有個(gè)朋友找我問(wèn)有沒(méi)有一些能像Windows一樣計(jì)劃任務(wù)重啟的軟件,我也不清楚。他它說(shuō)能讓我做一個(gè)給他它么?我考慮了一下,他的服務(wù)器都是有安裝.NET框架的,那可以用.NET來(lái)使下~~!
    2008-09-09
  • C#實(shí)現(xiàn)將javascript文件編譯成dll文件的方法

    C#實(shí)現(xiàn)將javascript文件編譯成dll文件的方法

    這篇文章主要介紹了C#實(shí)現(xiàn)將javascript文件編譯成dll文件的方法,涉及C#編譯生成dll動(dòng)態(tài)鏈接庫(kù)文件的實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-11-11
  • C#常用自定義函數(shù)小結(jié)

    C#常用自定義函數(shù)小結(jié)

    這篇文章主要介紹了C#常用自定義函數(shù),包括將數(shù)組轉(zhuǎn)成字符串、DateTime時(shí)間格式轉(zhuǎn)換為Unix時(shí)間戳格式和生成某個(gè)范圍內(nèi)的隨機(jī)數(shù),需要的朋友可以參考下
    2014-09-09
  • C# DES加密算法中向量的作用詳細(xì)解析

    C# DES加密算法中向量的作用詳細(xì)解析

    以下是對(duì)C#中DES加密算法中向量的作用進(jìn)行了詳細(xì)的介紹,需要的朋友可以過(guò)來(lái)參考下
    2013-09-09
  • C#四種計(jì)時(shí)器Timer的區(qū)別和用法

    C#四種計(jì)時(shí)器Timer的區(qū)別和用法

    這篇文章介紹了C#四種計(jì)時(shí)器Timer的區(qū)別和用法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-05-05
  • C#設(shè)計(jì)模式之外觀模式介紹

    C#設(shè)計(jì)模式之外觀模式介紹

    外觀模式:為子系統(tǒng)中的一組接口提供一個(gè)一致的界面,此模式定義了一個(gè)高層的接口,這個(gè)借口使得這子系統(tǒng)容易使用
    2012-10-10
  • c# 實(shí)現(xiàn)模糊PID控制算法

    c# 實(shí)現(xiàn)模糊PID控制算法

    這篇文章主要介紹了c# 實(shí)現(xiàn)模糊PID控制算法的示例代碼,幫助大家更好的理解和使用c#編程語(yǔ)言,感興趣的朋友可以了解下
    2020-12-12
  • C#交錯(cuò)數(shù)組知識(shí)點(diǎn)分析

    C#交錯(cuò)數(shù)組知識(shí)點(diǎn)分析

    在本篇文章里小編給大家整理的是關(guān)于C#交錯(cuò)數(shù)組知識(shí)點(diǎn)分析,需要的朋友們參考下。
    2019-11-11

最新評(píng)論

北宁市| 巨鹿县| 曲阜市| 曲阳县| 昆明市| 容城县| 永年县| 鄂托克旗| 晋城| 朝阳区| 呼和浩特市| 西昌市| 大丰市| 沐川县| 六安市| 温州市| 弥勒县| 亳州市| 陵川县| 平顶山市| 宜君县| 呼和浩特市| 夏邑县| 敖汉旗| 青神县| 九龙城区| 昌乐县| 湟中县| 英德市| 区。| 吴旗县| 枝江市| 阿拉善右旗| 清水县| 安陆市| 四平市| 云和县| 明溪县| 柳江县| 鄂托克前旗| 佛教|