Плавность отрисовки в WinForms C#

Есть программа-тест. На ней панель размещена и она является задним фоном с разными фотографиями которые меняются по очереди. При обновлении фото на ней происходит не понятное мерцание. Вот что я пробовал

private const int WS_EX_COMPOSITED = 0x02000000;

        protected override CreateParams CreateParams
        {
            get
            {
                CreateParams cp = base.CreateParams;
                cp.ExStyle |= WS_EX_COMPOSITED;
                return cp;
            }
        }

Но это никак не повлияло. Очень благодарен, если кто-то поможет!

{
 panel2.BackgroundImade = Properties.Resourses.MyRes1;
 panel2.Visible = false;
 panel1.Visible = true;
 panel1.BackgroundImade = Properties.Resourses.MyRes;
}

{
 panel2.Visible = true;
 panel1.Visible = false;
 panel1.BackgroundImade = Properties.Resourses.MyRes3;

Ответы (2 шт):

Автор решения: S.H.

У Вас есть два способа решить проблему мерцания:

  1. Рекомендуемый способ - использование атрибута double buffering

Фактически, это означает установку DoubleBuffered = true; для панели или для всей формы - надо попробовать и так, и так

  1. Если это не поможет - тогда есть "классический хак": у вас должно быть 2 панели. Одного размера и расположенные по одному и тому же Location. Одна видимая, вторая - невидимая. В невидимую загружается следующая фотка. Потом - меняем атрибуты видимости местами: делаем первую панель невидимой, вторую (в которую уже полностью загрузилась фотка) - видимой.
→ Ссылка
Автор решения: Blackmeser
class panell : Panel
{
    protected override bool DoubleBuffered { get => true; }
}

Использовать panell вместо Panel. Если не поможет то через рефлексию:

using System.Reflection;
Type type = panel.GetType();
PropertyInfo propertyInfo = type.GetProperty("DoubleBuffered", BindingFlags.NonPublic | BindingFlags.Instance);
propertyInfo.SetValue(panel, true, null);

Сделал в интерактиве, ничего не мерцает даже без двойной буферизации:

#r "System.Windows.Forms"
using System.Windows.Forms;
Form f = new Form();
f.Show();
string s1 = @"..\18--w--1280.jpg";
string s2 = @"..\20--w--1280.jpg";
using System.Drawing;
f.BackgroundImage = Image.FromFile(s1);
Timer t = new Timer();
t.Interval = 500;
int i = 0;
t.Tick += (s, a) => f.BackgroundImage = Image.FromFile(i%2==0?s1:s2);
t.Tick += (s, a) => { f.BackgroundImage = Image.FromFile(i % 2 == 0 ? s1 : s2); i++; };
t.Enabled = true;
Button b = new Button();
f.Controls.Add(b);

Можете поделиться своим исходником с мерцанием?

→ Ссылка