Я обнаружил, что Invalidate () создает слишком много мерцания. Вот моя ситуация. Разрабатываемый мной пользовательский элемент управления рисует все содержимое путем обработки события Paint .
this.Paint += this.OnPaint;
Этот обработчик вызывает пользовательскую подпрограмму, которая выполняет фактическое рисование.
private void OnPaint(object sender, PaintEventArgs e)
{
this.DrawFrame(e.Graphics);
}
Для имитации прокрутки я хочу перекрашивать свой элемент управления каждый раз, когда курсор перемещается, пока нажата левая кнопка мыши. Мой первый выбор - использовать Invalidate () , как показано ниже.
private void RedrawFrame()
{
var r = new Rectangle(
0, 0, this.Width, this.Height);
this.Invalidate(r);
this.Update();
}
Управление прокручивается нормально, но мигает далеко за пределы любого комфортного уровня. Поэтому я решил вместо перерисовки элемента управления вызывать свой метод DrawFrame () непосредственно после обработки события MouseMove . Это произвело плавную прокрутку без мерцания.
private void RedrawFrame()
{
var g = Graphics.FromHwnd(this.Handle);
this.DrawFrame(g);
}
Этот подход может быть неприменим ко всем ситуациям, но пока он мне подходит.