C# 如何完全删除FlowLayoutPanel中的水平滚动条

C# 如何完全删除FlowLayoutPanel中的水平滚动条,c#,winforms,flowlayoutpanel,C#,Winforms,Flowlayoutpanel,我有带有多个控件的FlowLayoutPanel。通常水平滚动条不可见,且正常。但当我调整大小时,水平滚动条会出现并闪烁。调整大小后,它将不再可见 我尝试的是: (一) 这并不完全有效 (二) 之后,水平滚动条被禁用,但仍然可见 (三) 这并不完全有效 (四) 这并不完全有效 (五) 更好的是,水平滚动条闪烁更少,但仍然闪烁 (六) 这并不完全有效。我知道这是一篇老文章,但我找到了解决这个问题的方法。 (我这样做是为了垂直滚动条,因为这是我在自上而下的流动方向流动布局面板)上遇到的问题,但也可以

我有带有多个控件的
FlowLayoutPanel
。通常水平滚动条不可见,且正常。但当我调整大小时,水平滚动条会出现并闪烁。调整大小后,它将不再可见

我尝试的是:

(一)

这并不完全有效

(二)

之后,水平滚动条被禁用,但仍然可见

(三)

这并不完全有效

(四)

这并不完全有效

(五)

更好的是,水平滚动条闪烁更少,但仍然闪烁

(六)


这并不完全有效。

我知道这是一篇老文章,但我找到了解决这个问题的方法。 (我这样做是为了
垂直滚动条
,因为这是我在自上而下的
流动方向
流动布局面板
)上遇到的问题,但也可以对
水平滚动条
进行转码

// pContent is my FlowLayoutPanel, it has FlowDirection set to TopDown
// and WrapContent = true;
pContent.SuspendLayout();
// Populate the FlowLayoutPanel with controls
pContent.ResumeLayout();

// I want to show only HorizontalScrollbar
if (pContent.VerticalScroll.Visible)
    {
        pContent.AutoScroll = false;
        pContent.VerticalScroll.Visible = false;
        pContent.Height -= SystemInformation.HorizontalScrollBarHeight;
        pContent.AutoScroll = true;
        pContent.Height += SystemInformation.HorizontalScrollBarHeight;    
    }
因此,要隐藏水平滚动条:

// pContent has FlowDirection set to LeftRight and WrapContent = true;
pContent.SuspendLayout();
// Populate the FlowLayoutPanel with controls
pContent.ResumeLayout();

// I want to show only VerticalScrollbar
if (pContent.HorizontalScroll.Visible)
    {
        pContent.AutoScroll = false;
        pContent.HorizontalScroll.Visible = false;
        pContent.Width -= SystemInformation.VerticalScrollBarWidth;
        pContent.AutoScroll = true;
        pContent.Width += SystemInformation.VerticalScrollBarWidth;    
    }

解释“不能完全工作”…“不能完全工作”=添加这些行后,没有任何变化您正在调整哪些大小?表格?它有三个调整大小事件。是的,我用调整大小事件调整窗体大小。表单包含拆分容器。SplitContainer内部有flowlayoutpanel。此问题没有通用解决方案。滚动条最大的问题是它们占用了空间,减少了布局控件的可用大小。这给了布局引擎两种可能的解决方案,如果面板接近满,那么它可以适合垂直滚动条或水平滚动条。你看到它在两个解决方案之间来回闪烁,它不喜欢其中一个。取得成功的唯一方法是更好地使用SuspendLayout(),或者调整FLP的大小,使其总是太大或太小。
flowlayoutPanel.AutoScroll = true;
flowlayoutPanel.WrapContents = false;
[DllImport("user32.dll")]
static extern bool ShowScrollBar(IntPtr hWnd, int wBar, bool bShow);

protected override void OnShown(EventArgs e) {
    ShowScrollBar(this.flowlayoutPanel.Handle, SB_HORZ, false);
    base.OnShown(e);
}
flowlayoutPanel.SuspendLayout();
//resize controls inside flowlayoutPanel
flowlayoutPanel.ResumeLayout();
//ResizeBegin event
flowlayoutPanel.AutoScroll = false;
//ResizeEnd event
flowlayoutPanel.AutoScroll = true;
// pContent is my FlowLayoutPanel, it has FlowDirection set to TopDown
// and WrapContent = true;
pContent.SuspendLayout();
// Populate the FlowLayoutPanel with controls
pContent.ResumeLayout();

// I want to show only HorizontalScrollbar
if (pContent.VerticalScroll.Visible)
    {
        pContent.AutoScroll = false;
        pContent.VerticalScroll.Visible = false;
        pContent.Height -= SystemInformation.HorizontalScrollBarHeight;
        pContent.AutoScroll = true;
        pContent.Height += SystemInformation.HorizontalScrollBarHeight;    
    }
// pContent has FlowDirection set to LeftRight and WrapContent = true;
pContent.SuspendLayout();
// Populate the FlowLayoutPanel with controls
pContent.ResumeLayout();

// I want to show only VerticalScrollbar
if (pContent.HorizontalScroll.Visible)
    {
        pContent.AutoScroll = false;
        pContent.HorizontalScroll.Visible = false;
        pContent.Width -= SystemInformation.VerticalScrollBarWidth;
        pContent.AutoScroll = true;
        pContent.Width += SystemInformation.VerticalScrollBarWidth;    
    }