[英]Automate control creation in windows forms designer
在設計模式下,我需要自動創建和配置表單中的多個控件。
對於這樣的事情,我創建了一個控件,該控件與表單中的其他控件進行交互和修改,並設置默認值,向網格中添加列,...完成后,我就刪除了控件。
這是創建臨時宏的一種不太復雜的技術,但是它就像一種魅力,可以簡化配置屬性的重復工作,特別是對於帶有大量元素(例如網格)的“大”對象。
問題是在設計模式下 ,我無法創建新控件並將其動態添加到表單中 。 考慮下面的代碼(只是一個簡化的示例):
public partial class ButtonCreator : UserControl
[Category("Automation")]
public int LeftPosition { get; set; }
[Category("Automation")]
public bool AutoCreate
{
get { return false; }
set
{
var form = FindForm();
if (value)
{
for (var i = 10; i < 100; i = i + 20)
{
var button = new Button(){Name = "btn_" + DateTime.Now.Ticks + "_" + i};
form.Controls.Add(button);
button.Location = new Point(LeftPosition, i);
button.BringToFront();
}
}
}
}
(我也嘗試過使用具有類似代碼的組件設計器,但是結果相同,因此這種方式不那么冗長)
要使用此功能,我將ButtonCreator的一個實例添加到窗體,然后設置AutoCreate屬性(在設計模式下,從屬性列表中)。 顯然,它可以工作並將按鈕添加到表單中,但是它們並未序列化為自動生成的C#代碼,保存后我將其丟失。
當Visual Studio生成designer.cs文件時,有什么辦法可以迫使他們序列化?
請考慮以下限制:這不是要發布的代碼,只是為了簡化開發而編寫的臟代碼,因此,我寧願避免使用更復雜的技術,以便能夠在編碼時輕松地引入更改。 如果可能,應避免引用Visual Studio自動化或創建Visual Studio擴展。
根據Hans Passant的評論,所需要做的只是要求設計者環境創建對象,以便可以跟蹤新組件。
var host = GetService(typeof(IDesignerHost)) as IDesignerHost;
var button = host.CreateComponent(typeof(Button), "someName") as Button;
FindForm().Controls.Add(button);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.