【问题标题】:Design time support for user controls, that are containers for other controls对用户控件的设计时支持,这些控件是其他控件的容器
【发布时间】:2013-04-30 12:45:02
【问题描述】:

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

对于我所有的代码 sn-ps,我创建了一个新的 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 继承。

感谢您的帮助!

【问题讨论】:

    标签: .net vb.net nested-controls


    【解决方案1】:

    刚刚遇到这个问题。这个问题很老了,但是,如果您还没有找到任何解决方案,请尝试以下方法:

    从以下链接下载源代码:

    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的面板是半透明的..有控件!

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-11-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-13
        • 2011-07-10
        • 1970-01-01
        相关资源
        最近更新 更多