Qwertiy возможно потому что она нужна.
AutoScroll весьма чувствителен к чёткости вместимости элементов.
У меня
- Код: Выделить всё
Imports System
Imports System.Drawing
Imports System.Windows.Forms
Public Class TestControl
Inherits Panel
Private Pnl As New FlowLayoutPanel() With {.AutoSize = True, .AutoSizeMode = Windows.Forms.AutoSizeMode.GrowAndShrink, .Margin = New Padding(0), .Padding = New Padding(0)}
Private WithEvents BtnNew As New Button() With {.Text = "+", .ForeColor = Color.Blue, .Visible = True}
Public Sub New()
With Me
.BackgroundImageLayout = ImageLayout.Zoom
.AutoScroll = True
.Location = New Point(4, 4)
.Size = New Size(460, 323)
.MinimumSize = New Size(460, 323)
.MaximumSize = New Size(460, 323)
#If VBC_VER > 9 Then
AddHandler BtnNew.SizeChanged, Sub() If BtnNew.Height Then BtnNew.Font = New Font(BtnNew.Font.Name, BtnNew.Height >> 2)
#Else
AddHandler BtnNew.SizeChanged, AddressOf OnButtonSizeChanged
#End If
.Controls.Add(Pnl)
Pnl.Controls.Add(BtnNew)
SetSizes()
'AddHandler Pnl.ControlAdded, AddressOf OnControllAdded
End With
End Sub
'Private Sub OnControllAdded(ByVal obj As Object, ByVal cea As ControlEventArgs)
' Dim pnl = DirectCast(obj, Panel)
' If pnl Is Nothing Then Return
' Dim iCur As Integer = 0
' Dim iSumm As Integer = 0
' For Each ctr As Control In pnl.Controls
' If ctr.Bottom > iCur Then
' iCur = ctr.Bottom
' iSumm += iCur
' End If
' Next ctr
' If iSumm > pnl.Height Then
' pnl.VerticalScroll.Visible = True
' End If
'End Sub
#If VBC_VER <= 9 Then
Private Sub OnButtonSizeChanged(ByVal obj As Object, ByVal ea As EventArgs)
If BtnNew.Height Then BtnNew.Font = New Font(BtnNew.Font.Name, BtnNew.Height >> 2)
End Sub
#End If
Private Sub SetSizes()
Dim Width As Integer = (Me.ClientSize.Width - 20) \ 3, Height As Integer = (Me.ClientSize.Height - 20) \ 3
Pnl.Width = Me.ClientSize.Width - 2
Pnl.MaximumSize = New Size(Me.ClientSize.Width - 2, Integer.MaxValue)
For Each Ctrl As Control In Pnl.Controls
With Ctrl
.Width = Width
.Height = Height
End With
Next Ctrl
End Sub
Protected Overrides Sub OnClientSizeChanged(ByVal e As System.EventArgs)
SetSizes()
MyBase.OnClientSizeChanged(e)
End Sub
Private Sub BtnNew_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles BtnNew.Click
Pnl.Controls.Add(New CheckBox() With {.Size = BtnNew.Size, .Appearance = Windows.Forms.Appearance.Button})
End Sub
End Class
Class TestTheTestControl
Inherits Form
<STAThread()> Shared Sub Main()
Application.EnableVisualStyles()
Application.Run(New TestTheTestControl())
End Sub
Protected Overrides Sub OnLoad(ByVal ea As EventArgs)
Me.Controls.Add(New TestControl())
'MyBase.OnLoad(ea)
End Sub
End Class
она появляется сразу перед появлением вертикальной полосы прокрутки и тут же исчезает, при последующем добавлении кнопки.
Есть несколько вариантов.
Ну во первых, наследование и размещение. Если нужен функционал одной из панелей нужно от нее и наследоваться. Допустим от FlowLayoutPanel, и тут же в нём размещать элементы, а не в наследованном разместить панель, в которую добавляем элементы.
Однако к скролингу это напрямую не относится. Что бы обуздать последний, нужно разобраться как работает AutoScroll и найти связанные события. Практические все события ScrollableControl наследуются от Control, а новое Scroll к AutoScroll не относится.
Возьмём к примеру ControllAdded и в нём проверяем доступность появления вертикального скроллинга (см. закомментированное в коде выше).
AutoScrool в этом случаи должен быть False, но в таком случаи обслуживание событий скроллинга ложится на наши плечи.
Ещё как вариант поиграться размерами элементов и панели, дабы горизонтальному скроллингу ну никак не было необходимости появляться.