¿Cómo puedo doble búfer de un Panel?

Tengo un panel que tiene una rueda de ruleta, y necesito búfer doble el panel, por lo que se detiene el parpadeo. Alguien me puede ayudar?

EDICIÓN:

Sí, he intentado.

panel1.doublebuffered no existe, solo esta.doublebuffered. Y no tengo la necesidad de amortiguar el Formulario, solo el Panel.

Panel de no tiene un DoubleBuffered propiedad (JP vinculados a la doc). Tenga en cuenta que la propiedad está protegida, que es la razón por la que usted no puede llegar a ella. Hacer una subclase de Panel, y la puso en el constructor.
Tal vez este no es un problema para los demás, pero el valor en InitializeComponent hace que el diseñador de bloqueo; como menciona @Andy, hacerlo en el constructor.

OriginalEl autor | 2009-05-04

4 Kommentare

  1. 22

    Tiene que derivar de Panel o Cuadro de imagen.

    Hay ramificaciones a esto dependiendo de cómo usted elige para habilitar el almacenamiento en búfer.

    Si establece el este.DoubleBuffer bandera, a continuación, usted debería estar bien.

    Si actualizar manualmente los estilos, a continuación, usted tiene que pintar el formulario en el mensaje WM_PAINT.

    Si realmente te sientes ambicioso usted puede mantener y dibujar su propio buffer, como un mapa de bits.

    
    using System.Windows.Forms;
    
    public class MyDisplay : Panel
    {
        public MyDisplay()
        {
            this.DoubleBuffered = true;
    
            //or
    
            SetStyle(ControlStyles.AllPaintingInWmPaint, true);
            SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
            UpdateStyles();
        }
    }
    Gracias por publicar la respuesta.
    AFAIK PictureBox es de doble búfer de todos modos..

    OriginalEl autor user79755

  2. 11

    Otra forma de hacer esto es para invocar el miembro doublebuffered, utilizando el método InvokeMember:

     typeof(Panel).InvokeMember("DoubleBuffered", BindingFlags.SetProperty    
                | BindingFlags.Instance | BindingFlags.NonPublic, null,
                panel2, new object[] { true }); 

    Por hacerlo de esta manera, usted no tiene que crear una subclase

    OriginalEl autor Jakob Danielsson

  3. 5

    Puede hacer que el DoubleBuffered-Propiedad pública en un derivided clase de Panel:

    public class DoubleBufferedPanel : Panel
    {        
        [DefaultValue(true)]
        public new bool DoubleBuffered
        {
            get
            {
                return base.DoubleBuffered;
            }
            set
            {
                base.DoubleBuffered = value;
            }
        }
    }
    Ya que no hay ningún punto en el uso de esta clase excepto con doble búfer, me gustaría hacer que sea aún más sencillo: class DoubleBufferedPanel: Panel { public DoubleBufferedPanel(): base() { DoubleBuffered = true; } }.
    Muy simple, de hecho. Después de agregar este one-liner para mi proyecto, todo lo que tenía que hacer, era ir al Diseñador y cambiar el Tipo de datos del panel en cuestión en dos lugares y todo está bien ahora.. Muy cool!

    OriginalEl autor Koopakiller

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea