Поддержка времени разработки для пользовательских элементов управления, которые являются контейнерами для других элементов управления

Мне нравится создавать пользовательский элемент управления, который (среди других элементов управления) содержит панель. Коллеги-разработчики должны иметь возможность добавлять другие элементы управления во время разработки на панель моего пользовательского элемента управления.
К сожалению, все примеры, которые я нашел в Интернете, не работают должным образом (или я делаю что-то не так, что может быть более вероятным).

Для всех моих фрагментов кода я создал новый проект 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()

Выполнить программу. Вы можете видеть, что панель, содержащая пользовательский контроль, является полупрозрачной. С элементами управления!

Другие вопросы по тегам