代码之家  ›  专栏  ›  技术社区  ›  Ksempac

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

  •  10
  • Ksempac  · 技术社区  · 17 年前

    我正在制作一些控件,它们都必须具有相同的外观和一些常见的行为,尽管它们用于不同类型的输入。所以我创建了一个从usercontrol继承的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 回复  |  直到 16 年前
        1
  •  11
  •   Ben Arroyo    16 年前

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

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

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

        2
  •  1
  •   SLaks    17 年前

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

    [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
    
        3
  •  0
  •   Shea    17 年前

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

        4
  •  0
  •   SLaks    17 年前

    试着做一个 ParentControlDesigner 为了您的控制,覆盖 InternalControlDesigner 并返回 (designerHost.GetDesigner(tableLayoutPanel) as ControlDesigner) . designerHost (IDesignerHost) component.Site.GetService(typeof(IDesignerHost)) .

        5
  •  0
  •   serialhobbyist    17 年前

    我隐约记得通过将基类放入自己的dll并首先构建它来解决类似的问题。我翻了一遍,但找不到那个项目。对不起的。

    推荐文章