.net 如何在停靠模式下排列控件

.net 如何在停靠模式下排列控件,.net,vb.net,winforms,.net,Vb.net,Winforms,我几乎花了2个小时对这些控件进行反复试验。我需要一些帮助。 这就是我的目标。。为了能把三个都停靠在右边,在进度条下面。。和X Y下的轨迹栏。。(我最大化了我的表单,所以我需要停靠它)除非你有一些很酷的技巧可以自动适应 X和Y是标签。。显示我的地图坐标。 然后在它们下面是面板内的轨迹栏 尝试的解决方案-结果: 正确对接它们-X面板Y/X Y面板 将三个放置在面板上,并停靠在右侧-占用太多宽度的X Y轨道上 没有面板,停靠三条右侧轨道X Y 停靠点X Y顶部-出现在左上方,X位于Y下方 我没有

我几乎花了2个小时对这些控件进行反复试验。我需要一些帮助。
这就是我的目标。。为了能把三个都停靠在右边,在进度条下面。。和X Y下的轨迹栏。。(我最大化了我的表单,所以我需要停靠它)除非你有一些很酷的技巧可以自动适应

X和Y是标签。。显示我的地图坐标。
然后在它们下面是
面板内的
轨迹栏

尝试的解决方案-结果:

  • 正确对接它们-X面板Y/X Y面板
  • 将三个放置在面板上,并停靠在右侧-占用太多宽度的X Y轨道上
  • 没有面板,停靠三条右侧轨道X Y
  • 停靠点X Y顶部-出现在左上方,X位于Y下方
我没有得到我想要的。。有什么想法吗?

将所有控件添加到

将面板的流向设置为“向右至向左”

在designer中,选择面板中包含的所有控件,并将属性“FlowBreak”设置为“True”

备选方案

您还可以创建自己的流面板

Public Class MyFlowPanel
    Inherits Panel

    Protected Overrides Function CreateControlsInstance() As System.Windows.Forms.Control.ControlCollection
        Return New ControlCollection(Me)
    End Function

    Private Sub EnsureLayout(sender As Object, e As EventArgs)
        If (Not Me.isUpdatingLayout) Then
            Me.UpdateLayout()
        End If
    End Sub

    Private Sub NotifyControlIndexChanged(child As Control)
        'This will cause some selection issues in designer.
        'Implement a custom designer to fix this.
        Me.UpdateLayout()
    End Sub

    Protected Overrides Sub OnControlAdded(e As System.Windows.Forms.ControlEventArgs)
        AddHandler e.Control.SizeChanged, New EventHandler(AddressOf Me.EnsureLayout)
        AddHandler e.Control.LocationChanged, New EventHandler(AddressOf Me.EnsureLayout)
        AddHandler e.Control.Resize, New EventHandler(AddressOf Me.EnsureLayout)
        AddHandler e.Control.MarginChanged, New EventHandler(AddressOf Me.EnsureLayout)
        MyBase.OnControlAdded(e)
        Me.UpdateLayout()
    End Sub

    Protected Overrides Sub OnControlRemoved(e As System.Windows.Forms.ControlEventArgs)
        RemoveHandler e.Control.SizeChanged, New EventHandler(AddressOf Me.EnsureLayout)
        RemoveHandler e.Control.LocationChanged, New EventHandler(AddressOf Me.EnsureLayout)
        RemoveHandler e.Control.Resize, New EventHandler(AddressOf Me.EnsureLayout)
        RemoveHandler e.Control.MarginChanged, New EventHandler(AddressOf Me.EnsureLayout)
        MyBase.OnControlRemoved(e)
        Me.UpdateLayout()
    End Sub

    Protected Overrides Sub SetBoundsCore(x As Integer, y As Integer, width As Integer, height As Integer, specified As System.Windows.Forms.BoundsSpecified)
        MyBase.SetBoundsCore(x, y, width, height, specified)
        Me.UpdateLayout()
    End Sub

    Private Sub UpdateLayout()
        Me.isUpdatingLayout = True
        Dim top As Integer = Me.ClientRectangle.Top
        Dim right As Integer = Me.ClientRectangle.Right
        Dim c As Control
        For index = 0 To (Me.Controls.Count - 1)
            c = Me.Controls.Item(index)
            top += c.Margin.Top
            c.Location = New Point((right - (c.Width + c.Margin.Right)), top)
            top += (c.Height + c.Margin.Bottom)
        Next
        Me.isUpdatingLayout = False
    End Sub

    Private isUpdatingLayout As Boolean

    Public Shadows Class ControlCollection
        Inherits Panel.ControlCollection
        Public Sub New(owner As MyFlowPanel)
            MyBase.New(owner)
            Me.owner2 = owner
        End Sub
        Public Overrides Sub SetChildIndex(child As System.Windows.Forms.Control, newIndex As Integer)
            MyBase.SetChildIndex(child, newIndex)
            Me.owner2.NotifyControlIndexChanged(child)
        End Sub
        Private owner2 As MyFlowPanel
    End Class

End Class

您可以尝试将所有控件添加到FlowLayoutPanel。但没有完全修复它。trackbar不需要
flowlayoutpanel
哈哈,谢谢你提供的信息。
Public Class MyFlowPanel
    Inherits Panel

    Protected Overrides Function CreateControlsInstance() As System.Windows.Forms.Control.ControlCollection
        Return New ControlCollection(Me)
    End Function

    Private Sub EnsureLayout(sender As Object, e As EventArgs)
        If (Not Me.isUpdatingLayout) Then
            Me.UpdateLayout()
        End If
    End Sub

    Private Sub NotifyControlIndexChanged(child As Control)
        'This will cause some selection issues in designer.
        'Implement a custom designer to fix this.
        Me.UpdateLayout()
    End Sub

    Protected Overrides Sub OnControlAdded(e As System.Windows.Forms.ControlEventArgs)
        AddHandler e.Control.SizeChanged, New EventHandler(AddressOf Me.EnsureLayout)
        AddHandler e.Control.LocationChanged, New EventHandler(AddressOf Me.EnsureLayout)
        AddHandler e.Control.Resize, New EventHandler(AddressOf Me.EnsureLayout)
        AddHandler e.Control.MarginChanged, New EventHandler(AddressOf Me.EnsureLayout)
        MyBase.OnControlAdded(e)
        Me.UpdateLayout()
    End Sub

    Protected Overrides Sub OnControlRemoved(e As System.Windows.Forms.ControlEventArgs)
        RemoveHandler e.Control.SizeChanged, New EventHandler(AddressOf Me.EnsureLayout)
        RemoveHandler e.Control.LocationChanged, New EventHandler(AddressOf Me.EnsureLayout)
        RemoveHandler e.Control.Resize, New EventHandler(AddressOf Me.EnsureLayout)
        RemoveHandler e.Control.MarginChanged, New EventHandler(AddressOf Me.EnsureLayout)
        MyBase.OnControlRemoved(e)
        Me.UpdateLayout()
    End Sub

    Protected Overrides Sub SetBoundsCore(x As Integer, y As Integer, width As Integer, height As Integer, specified As System.Windows.Forms.BoundsSpecified)
        MyBase.SetBoundsCore(x, y, width, height, specified)
        Me.UpdateLayout()
    End Sub

    Private Sub UpdateLayout()
        Me.isUpdatingLayout = True
        Dim top As Integer = Me.ClientRectangle.Top
        Dim right As Integer = Me.ClientRectangle.Right
        Dim c As Control
        For index = 0 To (Me.Controls.Count - 1)
            c = Me.Controls.Item(index)
            top += c.Margin.Top
            c.Location = New Point((right - (c.Width + c.Margin.Right)), top)
            top += (c.Height + c.Margin.Bottom)
        Next
        Me.isUpdatingLayout = False
    End Sub

    Private isUpdatingLayout As Boolean

    Public Shadows Class ControlCollection
        Inherits Panel.ControlCollection
        Public Sub New(owner As MyFlowPanel)
            MyBase.New(owner)
            Me.owner2 = owner
        End Sub
        Public Overrides Sub SetChildIndex(child As System.Windows.Forms.Control, newIndex As Integer)
            MyBase.SetChildIndex(child, newIndex)
            Me.owner2.NotifyControlIndexChanged(child)
        End Sub
        Private owner2 As MyFlowPanel
    End Class

End Class