2013-04-30 62 views
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继承而来的最终不是一个选项。

谢谢你的帮助!

回答

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的背景颜色设置为Transparent。

加载修改的 'TransPanel' 用户控件到您的Form1的PANEL1:

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

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

0

我正面临同样的问题。当我继承了我创建的控件的类形式时,它的不同子控件(如GroupBox或Button)在设计器中被禁用;他们不能移动,他们的属性不能被编辑。

解决方案是将子控件声明为公共。首先是私人的Getter/Setter-Methode使他们暴露于外部世界。只要控件是在设计器中添加到现有的窗体上或另一个控件上,就可以正常工作。但是当我在设计器中从这个Control中打开一个继承的类时,发生了所描述的问题。将子控件更改为公开是对此的解决方案。

相关问题