C# Double Buffered не покраска

Я моделирую навигацию по карте и рисую сгенерированную часть карты на панели. Поскольку изображение мерцает, я должен использовать двойную буферизацию.

Вот мой код панели:

public class MapPanel : System.Windows.Forms.Panel
    {
        public MapPanel()
        {
            DoubleBuffered = true;
            ResizeRedraw = true;
        }
    }

И у меня есть следующий метод:

public void panelMap_Paint(object sender, PaintEventArgs e)
        {
            using (Graphics g = e.Graphics)
            {
                g.DrawImage(mapController.GetCurrentMap(), 0, 0, panelMap.Width, panelMap.Height);
            }
        }

Я не вызываю этот метод. У меня есть следующий код в.Designer.cs:

this.panelMap.Paint += new PaintEventHandler(this.panelMap_Paint);

И вызовите Invalidate() в MouseMove. Я уверен, что это событие происходит, я проверил его. Кажется, все правильно.

И тогда изображение не рисует. Я имею в виду, что панель пуста и кажется прозрачной или цветной в контрольном цвете по умолчанию. Однако, если я отключу двойную буферизацию, изображение будет правильно прорисовано, но, очевидно, оно будет мерцать. Не могли бы вы помочь мне?

2 ответа

Решение

Удалить using заявление. Вы избавляетесь от Graphics объект, прежде чем он будет использован для рисования на экран.

Как уже упоминалось, вы также должны удалить Invalidate() вызов из метода краски.

public void panelMap_Paint(object sender, PaintEventArgs e)
{
    var g = e.Graphics;
    g.DrawImage(mapController.GetCurrentMap(), 0, 0, panelMap.Width, panelMap.Height);
}

Вы должны закомментировать следующий код

//panelMap.Invalidate();

По данным MSDN

Invalidates the entire surface of the control and causes the control to be 
redrawn.
Другие вопросы по тегам