设计时支持用户控件,即其他控件的容器

时间:2013-04-30 12:45:02

标签: .net vb.net nested-controls

我喜欢创建一个用户控件(在其他控件中)包含一个面板。同事开发人员应该能够在设计时将其他控件添加到我的用户控件面板中 不幸的是,我在互联网上找到的所有例子似乎都没有正常工作(或者我做错了什么,可能更有可能)。

对于我的所有代码片段,我创建了一个新的winforms项目并添加了一个仅包含面板的用户控件。面板填充整个用户控件。


我在网上找到的第一个解决方案就是将控件归于此:

<Designer("System.Windows.Forms.Design.ParentControlDesigner, System.Design", GetType(IDesigner))> _
Public Class MyUserControl
...

当我编译我的程序并将我的用户控件添加到表单时,我可以向我的用户控件添加其他控件,但是我没有在设计时和运行时看到这些控件。我只在控件中看到添加的控件,同时在窗体上用鼠标拖动我的控件。


我找到的第二个解决方案是创建自己的ControlDesigner。为此,我向用户公开了我的用户控件面板......

Public Class MyUserControl

  Public ReadOnly Property Panel As Panel
    Get
      Return Me.InnerPanel
    End Get
  End Property

End Class

...创建了我自己的ControlDesigner ...

Public Class MyUserControlDesigner
  Inherits ParentControlDesigner

  Public Overrides Sub Initialize(ByVal component As IComponent)
    MyBase.Initialize(component)

    If (TypeOf MyBase.Control Is MyUserControl) Then
      MyBase.EnableDesignMode(DirectCast(MyBase.Control, MyUserControl).Panel, "Panel")
    End If
  End Sub

End Class

...并更改了我的用户控件的属性:

<Designer(GetType(MyUserControlDesigner))> _
Public Class MyUserControl
...

现在我可以在设计时向我的用户控件添加控件,我甚至可以看到这些添加的控件,至少在我启动程序之前。
之后我再也看不到添加的控件了,因为设计器生成的代码不会将这些控件添加到我面板的Controls集合中。

你有什么提示,为什么它不能像我希望它一样工作?

因为我还是喜欢使用自定义ControlDesigner,所以我更喜欢第二种方式的提示或解决方案。

我知道,对于这个例子,我不需要使用用户控件,我可以从Panel继承。但这只是我想要创建的控件的简化示例,因此最终不能继承Panel

感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

刚刚遇到这个问题。问题已经过时了,如果您还没有找到任何解决方案,请尝试以下方法:

从以下链接下载源代码:

http://addressof.com/articles/transcontrols_pt1.zip

打开TransPanel.vb并更改

Inherits System.Windows.Forms.Panel

Inherits System.Windows.Forms.UserControl

构建解决方案。现在为此TransPanel.vb添加一些随机控件,如文本框或标签。

在Form1中,您可以看到早期的TransPanel面板。删除它替换为普通Panel-Panel1。

  

将panel1的背景颜色设置为透明。

加载修改过的&#39; TransPanel&#39; usercontrol进入Form1的panel1:

Dim f As New TransControls.TransPanel
Panel1.Controls.Add(f)
f.Show()

执行程序。您可以看到包含Usercontrol的面板是半透明的..使用控件!

答案 1 :(得分:0)

我遇到了同样的问题。当我继承了我创建的Control的一个Class表单时,它上面的不同子控件(如GroupBox或Button)在设计器中被禁用;它们无法移动,无法编辑其属性。

解决方案是将子控件声明为公共。首先使用Getter / Setter-Methode将其置于私有状态,使其暴露于外部世界。只有在现有表单或另一个控件上的设计器中添加了Control时,这才能正常工作。但是当我在设计器中从此Control打开一个继承的类时,出现了所描述的问题。将子控件更改为公共是解决此问题的方法。