簡體   English   中英

如何向現有Winforms控件添加屬性

[英]How to add property to existing Winforms control

我不確定這是否可行。 我做了一些研究,但未能找到任何結論。 還有一個類似的問題在這里 ,但它的WPF。

我想要做的是將自定義屬性添加到我的表單上的現有WinForms GroupBox(或任何控件)。 對於此示例,我們將使用“鏈接”。 假設我程序中的每個GroupBox都包含一個超鏈接,然后我啟動程序時需要做的就是這樣做:

MyGroupBox.Link = "http:\\www.google.com\"

稍后在我的程序中,我可以設置我的超鏈接內容以引用MyGroupBox.Link

有可能像這樣操縱Winforms控件嗎? 如果我不需要,我寧願不做自定義控件。

我從這個問題中看到我可以擴展我的控制權,但是在我的具體情況下我會如何看待? 這與創建自定義控件相同嗎?

一種方法是使用Extender Providers。當它添加到表單時,它就像ToolTip組件一樣,它為該表單上的每個控件提供一個名為ToolTip的屬性。您可以創建此類:

    [ProvideProperty("Link", typeof(Control))]
    public class ExtendControls : Component, IExtenderProvider
    {
        private Dictionary<Control, string> links =
                                   new Dictionary<Control, string>();

        public bool CanExtend(object extendee)
        {
            return !(extendee is Form);
        }

        public void SetLink(Control extendee, string value)
        {
            if (value.Length == 0)
            {
                links.Remove(extendee);
            }
            else
            { 
                links[extendee] = value; 
            }
        }

        [DisplayName("Link")]
        [ExtenderProvidedProperty()]
        public string GetLink(Control extendee)
        {
            if (links.ContainsKey(extendee))
            {
                return links[extendee];
            }
            else
            {
                return string.Empty;
            }
        }
    }

它的作用是為所有控件提供Link屬性來處理表單。現在你在windowsforms項目中創建這個類並構建它,在你去工具箱中的表單設計器后你會看到extendcontrols組件拖動它在表單上,​​它將被放置在組件托盤中。幾乎完成...接下來,您可以在所需控件的屬性窗口中或在此類代碼中使用新的鏈接屬性(假設您將組件保留為默認值名稱):

//assuming ofcourse you have a button called button1
//i used button as the example you can use panel,datagridview,label,etc...
//to set it...
extendControls1.SetLink(button1, "sometest");
//to get it back...
string myLink = extendControls1.GetLink(button1);

我沒有嘗試使用GroupBox,但我想你可以在這里使用Button做類似的例子。

http://msdn.microsoft.com/en-us/library/7h62478z(v=vs.90).aspx

只需創建一個新類,稱之為MyGroupBox或任何你想要的:

public class MyGroupBox : GroupBox {
    private string link;

    public string Link {get {return link;} set{link=value;} }
}

這將繼承GroupBox中的所有行為/屬性,並為Link添加新屬性。

然后你就可以這樣使用它:

MyGroupBox groupBox = new MyGroupBox();
groupBox.Link = "www.google.com";

我認為這比使用tag屬性更清潔,老實說。 主要是因為它不是標簽,它是一個鏈接,我喜歡能夠恰當地命名該屬性。 :)雖然如果你需要為許多控件而不僅僅是GroupBox執行此操作,標簽可能會更容易。

為了回應Savanna,您可以使用Savanna描述的方法創建擴展類,然后將實際類拖到工具箱中。 奇怪的是,您將在工具箱中擁有它,准備好在設計器模式下拖動到您的表單,完成您添加的任何自定義屬性。

暫無
暫無

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

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