У меня есть приложение, которое показывает данные (фондовый рынок) в созданном мной пользовательском элементе управления. В моем приложении может быть более одного пользовательского элемента управления на одном экране для анализа нескольких акций. Учитывая эту функциональность, пользователь может переходить от одного элемента управления к нескольким элементам управления на экране. Эта функция вызвала мерцание. Чтобы решить проблему мерцания, я использовал двойную буферизацию, которая была включена с помощью кода ниже -
protected override CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
cp.ExStyle |= 0x02000000; // Turn on WS_EX_COMPOSITED
return cp;
}
}
Этот код выше определенно помог устранить проблему мерцания. Но создал другую проблему, которая - Иногда в этом пользовательском элементе управления появляется черное окно. Все, что я нашел идеальным в потоке кода, но не мог выяснить причину этого черного окна.
Удаление двойной буферизации дает правильный результат, но снова появляется мерцание.
Вот изображение для лучшего понимания проблемы -
Вы пробовали Control.SetStyle()
с добавлением ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint | ControlStyles.ResizeRedraw | ControlStyles.UserPaint, true
Я считаю, что написание моего собственного простого буфера может облегчить проблемы, полагаясь на собственный элемент управления:
private void CreateBuffer()
{
if (_buffer == null || _buffer.Size != ClientSize)
{
this._buffer?.Dispose();
_buffer = new Bitmap( ClientSize.Width, ClientSize.Height );
}
}
protected override void OnPaint( PaintEventArgs e )
{
CreateBuffer();
if (_is_dirty)
{
using (Graphics g = Graphics.FromImage( _buffer ))
{
RenderEventArgs ev = new RenderEventArgs( _buffer, g );
OnRender( ev ); /* Do your drawing here */
_is_dirty = False;
}
}
e.Graphics.DrawImage( _buffer, 0, 0 );
}