簡體   English   中英

如何在winforms設計器中訪問繼承的控件

[英]How to access inherited controls in the winforms designer

我正在制作一些控件,它們都必須共享相同的外觀和一些常見的行為,盡管它們用於不同類型的輸入。 所以我創建了一個繼承自UserControl的BaseClass,我的所有控件都繼承自BaseClass。

但是,如果我在設計器中添加BaseClass的控件,例如TableLayoutPanel,我在設計繼承的類時無法訪問它們。 我看到了TableLayoutPanel,但即使他是“受保護的”,我也無法修改它或通過設計器將控件放入其中。 我通過代碼訪問它沒有任何問題,但我不想失去使用設計器的能力。

現在,我只是從BaseClass中刪除了所有控件,在每個繼承的類中添加了布局和所有常用控件,然后使用引用在BaseClass中操作它們。 但這根本不能讓我滿意。 有沒有辦法讓設計師使用繼承的受保護成員控件?

環境:C#,.NET 3.5,Visual Studio 2008

編輯回答SLaks的建議。 我嘗試設置一個屬性,雖然我不習慣使用它,但它似乎不起作用。 這是我試過的代碼:

    public partial class UserControl1 : UserControl
    {
            public UserControl1()
            {
                    InitializeComponent();
            }

            public TableLayoutPanel TableLayoutPanel1
            {
                    get { return tableLayoutPanel1;}
                    set { tableLayoutPanel1 = value;}
            }
    }

    public partial class UserControl2 : UserControl1
    {
            public UserControl2()
            {
                    InitializeComponent();
            }
    }

當您嘗試從設計器的繼承控件訪問基本控件中聲明的TableLayoutPanel時,您將在WinForms中使用名為“Visual Inheritance”的功能。

不幸的是,TableLayoutPanel不支持可視繼承: http//msdn.microsoft.com/en-us/library/ms171689%28VS.80%29.aspx

這就是為什么TableLayoutPanel在繼承的控件中出現阻塞的原因。

嘗試將此屬性添加到面板的定義中(這可能有幫助也可能沒有幫助):

[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]

您必須自己設計基本控件。 成功重建控件項目后,更改將反映在設計器中。 如果您將成員公開,則可以編輯它們,但更改將不會保留。

嘗試為您的控件創建ParentControlDesigner ,重寫InternalControlDesigner ,並返回(designerHost.GetDesigner(tableLayoutPanel) as ControlDesigner) designerHost(IDesignerHost) component.Site.GetService(typeof(IDesignerHost))

我依稀記得通過將基類放在它自己的DLL並首先構建它來解決類似的問題。 我有翻找,但我找不到這個項目。 抱歉。

暫無
暫無

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

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