我想创建一个像控件一样的表,滚动时会有许多顶行保留在原位。 我在OnPaint方法的覆盖中绘制控件。
当滚动时,一些部分重绘会自动发生,但这会产生伪影并且看起来很奇怪。为了解决这个问题,我调用了Invalidate();或Refresh();在附加到滚动事件的事件处理程序中,并在绘制应该滚入/滚出视图的部分时将滚动位置记入帐户。但是,当我这样做时,应该保留在原位的部分会被滚动并一次又一次地发送回来。 (所以它有点闪烁) 我试图在没有闪烁的情况下顺利完成这项工作。
为了简化这个问题,我制作了以下代码,我在这里绘制了一条在滚动时应该保留的行。 如您所见,滚动时会开始闪烁。
我已经考虑过双重缓冲,例如你可以在代码中看到。
有谁知道如何让线路保持原位? 提前谢谢。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;
namespace ColumnReaderUITryOut
{
public partial class CustomPaintScrollTest : UserControl
{
public CustomPaintScrollTest()
{
InitializeComponent();
AutoScrollMinSize = new Size(500, 600);
SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
SetStyle(ControlStyles.AllPaintingInWmPaint, true);
SetStyle(ControlStyles.UserPaint, true);
ResizeRedraw = true;
}
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
e.Graphics.DrawLine(Pens.Black, 0, 0, Width, Height);
}
private void CustomPaintScrollTest_Scroll(object sender, ScrollEventArgs e)
{
Invalidate();
}
}
}