Поддержка времени разработки для пользовательских элементов управления, которые являются контейнерами для других элементов управления
Мне нравится создавать пользовательский элемент управления, который (среди других элементов управления) содержит панель. Коллеги-разработчики должны иметь возможность добавлять другие элементы управления во время разработки на панель моего пользовательского элемента управления.
К сожалению, все примеры, которые я нашел в Интернете, не работают должным образом (или я делаю что-то не так, что может быть более вероятным).
Для всех моих фрагментов кода я создал новый проект 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 ответа
Я столкнулся с той же проблемой. Когда я унаследовал форму класса, которую создал элемент управления, в нем были отключены различные подчиненные элементы управления (например, GroupBox или Button); их нельзя перемещать, а их свойства нельзя редактировать.
Решением было объявить субконтроль как открытый. Сначала они были Приватными с Методом Геттера / Сеттера, делающим их открытыми для внешнего мира. Это работало нормально, только если элемент управления был добавлен в конструктор в существующую форму или в другой элемент управления. Но когда я открыл унаследованный класс из этого элемента управления в конструкторе, возникла описанная проблема. Изменение суб-элементов управления на Public было решением этой проблемы.
Просто наткнулся на этот вопрос. Вопрос довольно старый, однако, если вы не нашли никакого решения, попробуйте следующее:
Загрузите исходный код по ссылке ниже:
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.
Установите цвет фона панели "1" на "Прозрачный".
Загрузите измененный пользовательский контроль TransPanel в панель Form1:
Dim f As New TransControls.TransPanel
Panel1.Controls.Add(f)
f.Show()
Выполнить программу. Вы можете видеть, что панель, содержащая пользовательский контроль, является полупрозрачной. С элементами управления!