Как получить видимые дочерние элементы управления при прокрутке родительского элемента управления? - PullRequest
1 голос
/ 21 марта 2019

enter image description here

Мой код при добавлении ярлыков на панель:

 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    For i As Integer = 0 To 50
        Panel1.Controls.Add(New Label With {.BorderStyle = BorderStyle.FixedSingle, .AutoSize = False, .Visible = True, .Text = i.ToString, .Width = 50, .Dock = DockStyle.Left})
    Next
End Sub

Теперь, как получить видимые метки при прокрутке Panel, может быть, в событии Panel1.Scroll?

 Private Sub Panel1_Scroll(sender As Object, e As ScrollEventArgs) Handles Panel1.Scroll
    If e.ScrollOrientation = ScrollOrientation.HorizontalScroll Then
        'HOW ?????
    End If
End Sub

Ответы [ 2 ]

0 голосов
/ 21 марта 2019

Вы можете использовать методы Rectangle.Contains и Rectangle.IntersectWith , чтобы определить, является ли элемент управления полностью или частично видимым внутри контейнера.

Используя Rectangle.Contains, вы можете определить, полностью ли включен прямоугольник, определенный элементом Bounds элемента управления, в прямоугольник, определенный контейнером ClientRectangle.

Используя Rectangle.IntersectWith, вы можете определить, видна ли она только частично.

Этот метод позволяет вам указать, какие элементы управления следует учитывать: элементы управления, которые полностью видимы или только частично видны внутри своего Контейнерного элемента управления (в данном случае Panel).

В примере:

Dim visibleLabels = GetVisibleControls(CType(sender, Control), e.NewValue, False)

вернет коллекцию элементов управления (в данном случае меток), которые полностью видны внутри контейнера Panel1.

Private Sub Panel1_Scroll(sender As Object, e As ScrollEventArgs) Handles Panel1.Scroll
    If e.ScrollOrientation = ScrollOrientation.HorizontalScroll Then
        Dim visibleLabels = GetVisibleControls(CType(sender, Control), e.NewValue, False)
    End If
End Sub

Private Function GetVisibleControls(container As Control, ScrollPosition As Integer, allowPartial As Boolean) As IEnumerable(Of Control)
    Dim ctrls = New List(Of Control)
    Dim rect As Rectangle = container.ClientRectangle

    For Each ctl As Control In container.Controls
        If allowPartial Then
            If ctl.Bounds.IntersectsWith(rect) Then
                ctrls.Add(ctl)
            End If
        Else
            If rect.Contains(ctl.Bounds) Then
                ctrls.Add(ctl)
            End If
        End If
    Next
    Return ctrls
End Function
0 голосов
/ 21 марта 2019

Вы можете получить видимые метки при прокрутке.Вы должны посмотреть, какая метка находится в ClientRectangle из Panel1.Это видимая область Panel1.
В вашем вопросе неясно, что вы хотите сделать с видимыми метками.Предположим, вы хотите написать имена видимых меток в Textbox1 при прокрутке Panel1.Это можно сделать с помощью следующего кода:

Private Sub Panel1_Scroll(sender As Object, e As ScrollEventArgs) Handles Panel1.Scroll
    Dim myBounds as Rectangle = Panel1.ClientRectangle
    TextBox4.Text = ""
    For Each control in Panel1.Controls
        Dim label as Label = CType(control,Label)
        if label.Location.X > myBounds.X And label.Location.X<myBounds.Width Or label.Location.X+label.Width>myBounds.X AND label.Location.X+label.Width<myBounds.Width Then
            TextBox4.Text +=  CType( control,Label).Text + vbCrLf
        End If
    Next
End Sub

Обратите внимание, что в приведенном выше подходе перечислены все частично видимые метки.Если вы просто хотите перечислить все метки, которые полностью видны, просто измените код:

Private Sub Panel1_Scroll(sender As Object, e As ScrollEventArgs) Handles Panel1.Scroll
    Dim myBounds as Rectangle = Panel1.ClientRectangle
    TextBox4.Text = ""
    For Each control in Panel1.Controls
        Dim label as Label = CType(control,Label)
        if label.Location.X > myBounds.X And label.Location.X<myBounds.Width AND label.Location.X+label.Width>myBounds.X AND label.Location.X+label.Width<myBounds.Width Then
            TextBox4.Text +=  CType( control,Label).Text + vbCrLf
        End If
    Next
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...