滚动时刷新flowlayoutpanel中的子控件

时间:2013-05-17 05:08:30

标签: c# .net winforms custom-controls

在带有winforms的.NET 3.5中,我正在制作图像缩略图查看器控件。

主控件来自FlowLayoutPanel,它获取图像列表并显示它们。显示的图像是由CustomControl制作的,我在其上绘制和附带的标签以及控件的边框。 可以通过点击和yada yada来选择图像,就像你期望的那种控制一样。

这是一个截图:

enter image description here

那部分工作正常。问题是当我滚动FlowLayoutPanel派生控件时,边框没有正确重绘,并且还有剩余的行,如此屏幕截图所示:

enter image description here

我已将FlowLayoutPanel和图像设置为双缓冲。图像和标签没有问题,所以我怀疑它是别的东西,但无法弄清楚它是什么。

我认为用于绘制图像边框的方法可能有问题。这是我使用的代码:

    protected override void OnPaint(PaintEventArgs e)
    {
        Rectangle captionContainer;

        captionContainer = new Rectangle();
        if (!string.IsNullOrEmpty(this.Caption))
            captionContainer = this.DrawCaption(e.Graphics);

        if (this.Image != null)
            this.DrawImage(e.Graphics, captionContainer);

        this.Size = new Size(this.Padding.Horizontal + this.ImageSize.Width, this.Padding.Vertical + this.ImageSize.Height + captionContainer.Height);

        ControlPaint.DrawBorder(e.Graphics, e.ClipRectangle, this.currentBorderColor, ButtonBorderStyle.Solid);

        base.OnPaint(e);
    }

如果需要,我会发布更多代码,但它非常冗长,所以除非实际需要,否则我不想放太多代码。

有人能看出这出错的地方吗?

1 个答案:

答案 0 :(得分:1)

我通过使用Graphics对象绘制边框来解决问题。替换

ControlPaint.DrawBorder(e.Graphics, e.ClipRectangle, this.currentBorderColor, ButtonBorderStyle.Solid);

e.Graphics.DrawRectangle(new Pen(this.currentBorderColor, 1F), new Rectangle(Point.Empty, new Size(this.Width - 1, this.Height - 1)));

诀窍。不知道为什么一个人工作而不是另一个人工作......