簡體   English   中英

運行時創建Visual Studio表單設計器源代碼

[英]Run-time creation of Visual Studio form designer source code

我正在重構一個包含很多從運行時信息動態創建的表單的程序。

為了降低系統的復雜程度,我想為每個表單編寫單獨的代碼文件。 由於表單很多,我正在考慮一種方法來自動化從運行時收集的數據創建表單源代碼文件的過程。

例如,如果我有一個名為EditPeople的表單的運行時實例,我想創建EditPeople.designer.cs的源代碼,以便我可以在Windows窗體設計器中編輯該窗體。

你知道是否有一些框架或工具可以簡化這項任務嗎?

我剛剛看到這個問題,為了將來的參考你可以嘗試這樣的事情:

public static List<Control> GetAllControls(IList ctrls)
{
   List<Control> FormCtrls = new List<Control>();
   foreach (Control ctl in ctrls)
   {
      FormCtrls .Add(ctl);
      List<Control> SubCtrls = GetAllControls(ctl.Controls);
      FormCtrls .AddRange(SubCtrls);
   }
   return FormCtrls;
} 

你可以像這樣使用這個函數:

List<Control> ReturnedCtrls = GetAllControls(MyForm.Controls);

當您擁有所有控件的列表時,您可以執行以下操作:

foreach(Control ctrl in ReturnedCtrls)
{
   // Generate Designer Source using ctrl properties
   ctrl.Left
   ctrl.Top
   // etc...
}

如果打算重新創建表單的代碼,我認為使用.net反射器http://www.red-gate.com/products/reflector/及其插件FileDisassembler denisbauer.com/NETTools/FileDisassembler.aspx(我無法發布更多超過1超鏈接:))將幫助您在短時間內反編譯整個項目。

你不覺得嗎?

2 CodeCanvas - 沒辦法。 Reflector為您提供了一個類,而任務是序列化所有給定類的所有實例。 例如,類包含代碼:

for(int i=0; i<2;i++){
Controls.Add(new Button());
}

任務是使用以下代碼制作* .Designer.cs:

//...
InitializeComponent()
{
    //...
    button1 = new Button();
    button2 = new Button();
    button3 = new Button();
    //...
    this.Controls.Add(button1);
    this.Controls.Add(button2);
    this.Controls.Add(button3);
}
//...

這絕對不是反射器給你的東西。

CodeDom序列化可以成功,但它遵循自己的規則,不太可能提供表單的完整快照。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM