2013-04-30 64 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中打開一個繼承的類時,發生了所描述的問題。將子控件更改爲公開是對此的解決方案。

相關問題