C\#DesignSurface 를 이용 하여 간단 한 창 디자이너 를 어떻게 실현 합 니까?
8169 단어 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 의 컨트롤 참조 를 복원 할 수 있 습 니 다.그러나 이 디자이너 는 아직도 완선 되 지 않 은 부분 이 많 으 니 나중에 시간 이 있 으 면 다시 보완 하 세 요.
총결산
이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 면 댓 글 을 남 겨 주 십시오.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
C#Task를 사용하여 비동기식 작업을 수행하는 방법라인이 완성된 후에 이 라인을 다시 시작할 수 없습니다.반대로 조인(Join)만 결합할 수 있습니다 (프로세스가 현재 라인을 막습니다). 임무는 조합할 수 있는 것이다. 연장을 사용하여 그것들을 한데 연결시키는 것이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.