[英]Prevent Winforms Designer from Generating Property Values for Inherited Controls
[英]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.