Jak podwoić buffer.NET kontrola na formularzu?

Jak mogę ustawić chronioną DoubleBuffered właściwość kontrolek na formularzu, który cierpi na migotanie?

Author: JYelton, 2008-09-16

12 answers

Oto bardziej ogólna wersja Rozwiązania Dummy'S .

Możemy użyć reflection, aby uzyskać Właściwość protected DoubleBuffered, a następnie można ją ustawić na true.

Uwaga : powinieneś płacić podatki od deweloperów , a nie używać podwójnego buforowania, jeśli użytkownik jest uruchomiony w sesji usług terminala (np. pulpit.

public static void SetDoubleBuffered(System.Windows.Forms.Control c)
{
   //Taxes: Remote Desktop Connection and painting
   //http://blogs.msdn.com/oldnewthing/archive/2006/01/03/508694.aspx
   if (System.Windows.Forms.SystemInformation.TerminalServerSession)
      return;

   System.Reflection.PropertyInfo aProp = 
         typeof(System.Windows.Forms.Control).GetProperty(
               "DoubleBuffered", 
               System.Reflection.BindingFlags.NonPublic | 
               System.Reflection.BindingFlags.Instance);

   aProp.SetValue(c, true, null); 
}
 87
Author: Ian Boyd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-05-29 11:27:16

Sprawdź Ten wątek

Powtarzając rdzeń tej odpowiedzi, możesz włączyć flagę stylu WS_EX_COMPOSITED w oknie, aby zarówno formularz, jak i wszystkie jego kontrolki były dwukrotnie buforowane. Flaga stylu jest dostępna od XP. Nie sprawia, że malowanie jest szybsze, ale całe okno jest rysowane w buforze poza ekranem i przerzucane na ekran za jednym uderzeniem. Sprawia, że wygląda natychmiastowo dla oczu użytkownika bez widocznych artefaktów malarskich. Nie jest całkowicie bezproblemowy, niektóre wizualne renderery stylów mogą się na nim zepsuć, szczególnie TabControl, gdy ma zbyt wiele kart. YMMV.

Wklej ten kod do swojej klasy formularza:

protected override CreateParams CreateParams {
    get {
        var cp = base.CreateParams;
        cp.ExStyle |= 0x02000000;    // Turn on WS_EX_COMPOSITED
        return cp;
    } 
}

Duża różnica między tą techniką a Obsługą podwójnego buforowania Winform polega na tym, że wersja Winform działa tylko na jednym sterowaniu na raz. Nadal będziesz widzieć każdą pojedynczą farbę kontrolną. Które również mogą wyglądać jak efekt migotania, szczególnie jeśli niepomalowany prostokąt kontrolny źle kontrastuje z oknem tło.

 68
Author: Hans Passant,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-16 18:55:50
System.Reflection.PropertyInfo aProp = typeof(System.Windows.Forms.Control)
    .GetProperty("DoubleBuffered", System.Reflection.BindingFlags.NonPublic |
    System.Reflection.BindingFlags.Instance);
aProp.SetValue(ListView1, true, null);

Ian ma więcej informacji o używaniu tego na serwerze terminali.

 18
Author: dummy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 10:31:19
public void EnableDoubleBuffering()
{
   this.SetStyle(ControlStyles.DoubleBuffer | 
      ControlStyles.UserPaint | 
      ControlStyles.AllPaintingInWmPaint,
      true);
   this.UpdateStyles();
}
 12
Author: Arno,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-16 21:00:19

Jednym ze sposobów jest rozszerzenie konkretnej kontrolki, którą chcesz podwoić bufor i ustawienie właściwości DoubleBuffered wewnątrz kontrolki ctor.

Na przykład:

class Foo : Panel
{
    public Foo() { DoubleBuffered = true; }
}
 8
Author: Jeff Hubbard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-16 21:03:48

Metoda rozszerzenia do włączania lub wyłączania podwójnego buforowania dla kontrolek

public static class ControlExtentions
{
    /// <summary>
    /// Turn on or off control double buffering (Dirty hack!)
    /// </summary>
    /// <param name="control">Control to operate</param>
    /// <param name="setting">true to turn on double buffering</param>
    public static void MakeDoubleBuffered(this Control control, bool setting)
    {
        Type controlType = control.GetType();
        PropertyInfo pi = controlType.GetProperty("DoubleBuffered", BindingFlags.Instance | BindingFlags.NonPublic);
        pi.SetValue(control, setting, null);
    }
}

Użycie (na przykład jak zrobić DataGridView DoubleBuffered):

DataGridView _grid = new DataGridView();
//  ...
_grid.MakeDoubleBuffered(true);
 6
Author: MajesticRa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-16 10:49:53

Nobugz dostaje kredyt za metodę w swoim linku, ja tylko reposting. Dodaj to nadpisanie do formularza:

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

To działało najlepiej dla mnie, na Windows 7 otrzymywałem duże czarne bloki pojawiające się po zmianie rozmiaru ciężkiego formularza kontrolnego. Kontrola teraz odbić zamiast! Ale tak jest lepiej.

 5
Author: Chris S,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:02:40

Zanim spróbujesz podwójnego buforowania, sprawdź, czy SuspendLayout()/ResumeLayout() rozwiąże twój problem.

 4
Author: Joel Coehoorn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-16 21:05:18

To sprawiało mi smutek przez dwa dni z trzecią kontrolą, dopóki go nie namierzyłem.

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

Ostatnio miałem wiele dziur( odchodów) podczas zmiany rozmiaru / przerysowania kontrolki zawierającej kilka innych kontrolek.

Próbowałem WS_EX_COMPOSITED i WM_SETREDRAW ale nic nie działało dopóki nie użyłem tego:

private void myPanel_SizeChanged(object sender, EventArgs e)
{
     Application.DoEvents();
}
Chciałem to przekazać dalej.
 4
Author: dnennis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-24 16:03:07

Vb.net wersja tego doskonałego rozwiązania....:

Protected Overrides ReadOnly Property CreateParams() As CreateParams
    Get
        Dim cp As CreateParams = MyBase.CreateParams
        cp.ExStyle = cp.ExStyle Or &H2000000
        Return cp
    End Get
End Property
 3
Author: Flip70,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-06 07:34:40

Możesz również dziedziczyć kontrolki do własnych klas i ustawić tam właściwość. Ta metoda jest również miła, jeśli masz tendencję do wykonywania wielu konfiguracji, które są takie same na wszystkich kontrolkach.

 1
Author: MagicKat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-16 21:03:04

Odkryłem, że po prostu ustawienie ustawienia DoubleBuffered na formularzu automatycznie ustawia wszystkie właściwości wymienione tutaj.

 0
Author: ljs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-01-19 02:50:51