C\#DesignSurface 를 이용 하여 간단 한 창 디자이너 를 어떻게 실현 합 니까?

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
".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()방법 이 필요 합 니 다.


.CS 코드 는 사실 가장 간단 한 것 은 소스 코드 를 읽 고 되 돌아 오 면 됩 니 다.디자이너 가 컨트롤 이나 바 인 딩 이 벤트 를 추가 할 때 텍스트 작업 을 통 해 코드 를 보완 할 수 있 습 니 다.

 //      ,   
 public string GetTextCSCode()
 {
 Flush();
 return __CSTextCode;
 }
CodeDomHostLoader 클래스 에는 OnComponentRename 이 있 습 니 다.디자이너 가 구성 요소 이름 을 바 꿀 때 응답 합 니 다.배경.cs 의 컨트롤 참조 를 복원 할 수 있 습 니 다.


 
그러나 이 디자이너 는 아직도 완선 되 지 않 은 부분 이 많 으 니 나중에 시간 이 있 으 면 다시 보완 하 세 요.
총결산
이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 면 댓 글 을 남 겨 주 십시오.

좋은 웹페이지 즐겨찾기