簡體   English   中英

在Windows Forms Designer中自動創建控件

[英]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.

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