2014-09-10 3 views
0

Я пытаюсь создать пользовательский элемент управления StackPanel, который позволит мне складывать новые элементы управления по вертикали (например, WPF StackPanel, но используя формы Windows).re: поведение UserControl в дизайнере и во время выполнения

Я создал новый пользовательский элемент управления с основным кодом, показанным ниже, но даже несмотря на то, что мое местоположение получает назначенные правильные значения в дизайнере, я могу появляться окна сообщений, представление конструктора не изменяет дочерние элементы управления, которые я перетаскиваю на моей панели стека, а также во время выполнения мое место, кажется, перезаписаны с тем, что дизайнер считает правильным (а Место, где я поставил контроль)

Public Class StackPanel 
    Inherits Panel 
    Private biasHeight As Integer = 0 
    Private Sub StackPanel_ControlAdded(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ControlEventArgs) Handles MyBase.ControlAdded 
     Dim newControl As System.Windows.Forms.Control = e.Control 
     ' 
     ' NOT WORKING: Set location of the newly added control in a panel and at runtime 
     ' 
     newControl.Location = New System.Drawing.Point(0, biasHeight) 
     ' 
     ' Store the y-cooridnate of the next control 
     ' 
     biasHeight = biasHeight + newControl.Height 
    End Sub 
End Class 
+1

Почему вы изобретаете колесо? Вместо этого используйте 'FlowLayoutPanel'. –

+0

Спасибо, да, это окончательно правильный путь. Хотя я все еще хотел бы понять, почему мой UserControl не работает, как я бы надеялся. Вышеприведенный пример - просто упрощение контроля, над которым я работаю. – Radek

ответ

0

Обычно такого рода вещи будет сделано путем реализации пользовательских LayoutEngine. Msdn также имеет образец.

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

Итак, вместо того, чтобы изобретать колесо, я предлагаю вам использовать FlowLayoutPanel. Если вы вообще хотите его реализовать, сделайте это правильно. Я имею в виду создать ваш LayoutEngine, как показано в предоставленной ссылке. На самом деле эта ссылка имеет то, что вам нужно.

Смежные вопросы