如何防止垂直滚动条占用控件中的空间,从而导致水平滚动条?

bep*_*000 14 .net c# vb.net winforms

我有一个FlowLayoutPanel内置嵌入式自定义控件,我添加了元素(其他自定义控件).在FlowLayoutPanel我的布局事件中,我将所有控件FlowLayoutPanel的大小调整为包含的大小FlowLayoutPanel.

这样就可以了,直到需要一个垂直滚动条(AutoScroll = True),在其中占据空间FLpanel,导致出现水平滚动条.

你看到的乱码是我在元素的构造函数中生成的一些随机占位符文本.

我想阻止这个:

令人讨厌的滚动条效果

我尝试将一个垂直滚动控件添加到用户控件并FlowLayoutPanel.VertScroll.Value=sender.valueScroll事件中执行:它似乎工作,但在移动滚动条控件时,使实际的垂直和水平滚动条闪烁(出现和消失)很多.

我真的不知道是否有一些属性使滚动条在FlowLayoutPanel控件内容外部.

我在VB.Net中这样做,但C#答案很好(因为它基本上是相同的语法,至少在使用控件和UI时).

编辑


我忘了提到我有WrapContents=falseAutoScroll=trueFlowLayoutPanel.

此外,如果您认为这个设计很熟悉:它是Opera M2邮件列表屏幕的像素完美副本.

更新1


在你的评论之后,我想出了这个:

Public Class FlowListPanel ' The user control

Private Sub Me_Load(sender As Object, e As EventArgs) Handles Me.Load
    FL_Panel.AutoScroll = True ' FL_Panel is the FlowLayoutPanel
    FL_Panel.WrapContents = False

    FL_Panel.Dock = System.Windows.Forms.DockStyle.Fill
    FL_Panel.FlowDirection = System.Windows.Forms.FlowDirection.TopDown
    FL_Panel.Margin = New System.Windows.Forms.Padding(0)
End Sub

Sub AddItem(c As Control)
    FL_Panel.Controls.Add(c)
    ReorderControls()
End Sub

Private Sub FLP_CSC(sender As Object, e As EventArgs) Handles FL_Panel.ClientSizeChanged
    ReorderControls()
End Sub

Sub ReorderControls()
    For Each ctrl In FL_Panel.Controls
        ctrl.Width = FL_Panel.ClientSize.Width
    Next
End Sub

Private Sub FL_Panel_L(sender As Object, e As LayoutEventArgs) Handles FL_Panel.Layout
    ReorderControls()
End Sub

End Class
Run Code Online (Sandbox Code Playgroud)

它似乎工作,但是当达到垂直滚动条出现的临界点时,水平滚动条出现问题.

一旦添加了另一个项目,水平滚动条就会消失.

另外,我认为这个问题可能是由于ReorderControls没有调用sub 引起的,所以我做了一个按钮来调用它,但没有任何改变.

删除元素时不存在此问题(但仅在添加时发生).

调整窗口大小并且必须出现垂直滚动条时也会发生这种情况.

如下所示,在添加新元素后,它可以正常工作:

令人讨厌的滚动条效果返回

更新2


我遵循了Plutonix的建议(从其他答案中调整代码),所以我ReorderControls以这种方式对子应用了一些修改:

    Sub ReorderControls()

    Dim HScrollVis As Boolean = NativeMethods.IsHScrollVisible(FL_Panel)

    If HScrollVis Then ' HScroll visible -> kill it with fire!
        NativeMethods.ShowHideScrollBar(FL_Panel,
                                        NativeMethods.SBOrientation.SB_HORZ,
                                        False)
        Return ' as it works anyway...
    End If

    For Each ctrl In FL_Panel.Controls
        ctrl.Width = FL_Panel.ClientSize.Width
    Next
    End Sub
Run Code Online (Sandbox Code Playgroud)

现在,当垂直滚动条出现时,水平滚动条会闪烁一次,而不是停留在那里.

我喜欢GIF,所以这是当前的效果:

令人讨厌的滚动条效果:一种新的希望

正如你可能看不到的那样(由于gif的低帧率),水平条可能只对寻找它的人显而易见,只需几分之一秒.

我认为问题80%已经解决,并将继续前进.如果我或某人想出了一些确定的东西,我会立即接受答案.

Oct*_*oid 0

只需确保使用以下属性对其进行初始化:

this.WrapContents = false;
this.AutoScroll = true;
Run Code Online (Sandbox Code Playgroud)

您还需要确保添加到其中的控件的最大宽度为控件宽度减去滚动条宽度。

不过应该可以做到。


编辑:

我从我的一个自定义控件中得到了这个解决方案。然而,它似乎与这篇文章非常相似——我可能最初是从那里得到的,我真的记不清了。帖子链接以防万一。


编辑2:

由于您已经设置了这些属性并查看图像,因此您只需使要添加到 FlowPanel 的控件变窄或使 FlowPanel 变宽即可。

基本上,您必须只允许滚动条出现时所占用的空间。如果您确实想始终使用所有宽度,您可以检测它是否可见并强制内部控件相应地更新其布局。