1

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

对于我所有的代码片段,我创建了一个新的 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最终不是一个选项。

谢谢您的帮助!

4

2 回答 2

0

我面临着同样的问题。当我从我创建的控件中继承一个类时,它上面的不同子控件(如 GroupBox 或按钮)在设计器中被禁用;它们不能被移动并且它们的属性不能被编辑。

解决方案是将子控件声明为公共。首先,它们是私有的,具有 Getter/Setter-Methode,使它们暴露于外部世界。仅当控件被添加到现有窗体或另一个控件的设计器中时,这才正常工作。但是当我在设计器中打开从这个控件继承的类时,出现了所描述的问题。将子控件更改为公共是解决此问题的方法。

于 2014-09-16T11:15:39.333 回答
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 的背景颜色设置为透明。

将修改后的“TransPanel”用户控件加载到 Form1 的 panel1 中:

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

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

于 2014-04-28T10:19:58.290 回答