ScrollableControl中闪烁的滚动条

时间:2014-02-12 14:03:28

标签: c# winforms scrollbar flicker

我从UserControl派生了这个ScrollableControl,我只希望显示一个垂直滚动条。我绝不能配置为只显示垂直滚动条,无论如何。这似乎是一个winforms的缺陷。另一个问题是,只要父级调整大小,使控件不那么宽,就会立即显示水平滚动条,直到OnResize事件处理程序调整宽度。结果,水平滚动条闪烁,因为它的内容临时宽于滚动控件的宽度。这使得可滚动控件内部的组件在重新调整到可用空间时重绘了不必要的时间。当控件变宽时,永远不会显示水平滚动条。

所以我用Google搜索并找到了这个:Add vertical scroll bar to panel in .NET

似乎在提出,但现在两个滚动条,以及当这个外部滚动条滚动时,面板的内容都会闪烁。调整面板大小以减小宽度,显示和隐藏水平滚动条以及导致不必要的重绘的问题不再是,所以这是一个胜利。

这是控件的构造函数:

        public BarGraphPanel()
        {
            this.HScroll = false;
            this.VScroll = false;
            this.AutoScroll = false;
            this.VerticalScroll.Visible = false;
            this.HorizontalScroll.Visible = false;
            this.SetStyle(ControlStyles.UserPaint, true);
            this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
            this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
            this.SetStyle(ControlStyles.ResizeRedraw, true);
            this.DoubleBuffered = true;
        }

滚动时应该是什么样子:

enter image description here

滚动时的样子:

enter image description here

滚动时文本框的绘制效果不是很好,我可以接受,但两个滚动条闪烁(所以暂时显示3个滚动条!)是疯狂的。

是否有一种方法只在屏幕上显示一个滚动条(始终),而其他任何条形或其内容都没有闪烁?

2 个答案:

答案 0 :(得分:1)

MajinFro的回答实际上帮助了我:During FlowLayoutPanel scrolling, background distorts + flickers

当我没有按照建议覆盖CreateParams时,它不起作用,所以这似乎是一个必不可少的'技巧'。

答案 1 :(得分:1)

在面板滚动事件上设置此代码:

private void panel1_Scroll(object sender, ScrollEventArgs e)
    {
        panel1.Invalidate();
    }