c# – 如何防止垂直滚动条在控件中占用空间,导致水平滚动条?

c# – 如何防止垂直滚动条在控件中占用空间,导致水平滚动条?,第1张

概述我有一个嵌入了FlowLayoutPanel的自定义控件,我添加元素(其他自定义控件).在FlowLayoutPanel的布局事件中,我将FlowLayoutPanel中的所有控件调整为包含FlowLayoutPanel的大小. 直到垂直滚动条需要(自动滚屏= TRUE),以空间内FLpanel,引起水平滚动条将出现在该变细. 你看到的乱码是我在元素的构造函数中生成的一些随机占位符文本. 我想防止 我有一个嵌入了FlowLayoutPanel的自定义控件,我添加元素(其他自定义控件).在FlowLayoutPanel的布局事件中,我将FlowLayoutPanel中的所有控件调整为包含FlowLayoutPanel的大小.

直到垂直滚动条需要(自动滚屏= TRUE),以空间内FLpanel,引起水平滚动条将出现在该变细.

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

我想防止这个:

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

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

我在VB.Net这样做,但C#的回答都很好(因为它基本上是相同的语法,至少控制和放大器工作时,UI).

编辑

我忘了提到在FlowLayoutPanel中有WrapContents = false和autoScroll = true.

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

更新1

在你的意见后,我想出了这一点:

Public Class FlowListPanel ' The user controlPrivate 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 SubSub AddItem(c As Control)    FL_Panel.Controls.Add(c)    ReorderControls()End SubPrivate Sub FLP_CSC(sender As Object,e As EventArgs) Handles FL_Panel.ClIEntSizeChanged    ReorderControls()End SubSub ReorderControls()    For Each ctrl In FL_Panel.Controls        ctrl.WIDth = FL_Panel.ClIEntSize.WIDth    NextEnd SubPrivate Sub FL_Panel_L(sender As Object,e As LayoutEventArgs) Handles FL_Panel.Layout    ReorderControls()End SubEnd Class

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

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

另外,我认为这个问题可以通过子不叫ReorderControls引起的,所以我做了一个按钮来调用它,但没有任何改变.

删除元素时不存在此问题(但仅在添加时才会出现).

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

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

更新2

我按照Plutonix的提醒(适应代码from his other answer),所以我已经申请一些修改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

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

我喜欢gifs,所以这里是现在的效果:

正如你可能无法看到(由于GIF的低帧率),单杠可能是明显的只是有人找它,因为几分之一秒.

我认为80%的问题解决了,而且会继续下去.如果我或某人想出了一些确定的东西,我会及时接受答案.

解决方法 这是一种替代方法,为您提供您期望的结果.授予它并不直接回答您的问题,但在我看来,如果您需要混淆控件的工作方式,以获得所需的解决方案,则不会使用正确的控件.

而不是直接将您的控件添加到FowLayoutPanel中,

使用包含tableLayoutPanel的标准Panel对象.

将面板属性设置为…

自动滚屏=真

将tableLayoutPanel属性设置为

Dock = top

autosize = True,GrowAndSHrink

开始与tableLayoutPanel中的一个单元格..

现在把你的控件添加到tableLayoutPanel …

例如

Dim CTRL As New Your_User_ControltableLayoutPanel1.Controls.Add(CTRL)CTRL.Dock = DockStyle.top

当滚动条出现时,tableLAyoutPanel将水平收缩适当的量,并且所有包含的控件也将自动缩小.

总结

以上是内存溢出为你收集整理的c# – 如何防止垂直滚动条在控件中占用空间,导致水平滚动条?全部内容,希望文章能够帮你解决c# – 如何防止垂直滚动条在控件中占用空间,导致水平滚动条?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1237461.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-06
下一篇2022-06-06

发表评论

登录后才能评论

评论列表(0条)

    保存