如何在winforms设计器中访问继承的控件

时间:2009-06-25 21:22:44

标签: c# winforms visual-studio-2008

我正在制作一些所有必须共享相同外观和一些常见行为的控件,尽管它们用于不同类型的输入。所以我创建了一个继承自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();
            }
    }

5 个答案:

答案 0 :(得分:11)

当您尝试从设计器的继承控件访问基本控件中声明的TableLayoutPanel时,您将在WinForms中使用名为“Visual Inheritance”的功能。

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

这就是为什么TableLayoutPanel在继承的控件中出现阻塞的原因。

答案 1 :(得分:1)

尝试将此属性添加到面板的定义中(这可能有帮助也可能没有帮助):

[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]

答案 2 :(得分:0)

您必须自己设计基本控件。成功重建控件项目后,更改将反映在设计器中。如果您将成员公开,则可以对其进行编辑,但更改将不会保留。

答案 3 :(得分:0)

尝试为您的控件制作ParentControlDesigner,覆盖InternalControlDesigner,然后返回(designerHost.GetDesigner(tableLayoutPanel) as ControlDesigner)designerHost(IDesignerHost) component.Site.GetService(typeof(IDesignerHost))

答案 4 :(得分:0)

我依稀记得通过将基类放在它自己的DLL并首先构建它来解决类似的问题。我有翻找,但我找不到这个项目。遗憾。