Tengo un Windows Form (C# .NET 3.5) con una serie de botones y otros controles, todos asignados a un panel superior que abarca todo el formulario. Por ejemplo, la jerarquía es: Formulario -> Panel -> otros controles.Windows Forms: utilizando BackgroundImage ralentiza el dibujo de los controles del formulario
Tan pronto como asigne una Imagen de Fondo al Panel, los controles dibujan muy lentamente. Tengo el mismo efecto si utilizo la propiedad BackgroundImage del Formulario y establezco BackgroundColor del Panel como "transparente". Parece que la ventana con el fondo se dibuja primero, luego cada control se agrega uno a uno con un ligero retraso antes de dibujar el siguiente. En otras palabras, puede seguir el orden en que cada control se dibuja en el formulario. Una vez que se han dibujado todos los controles una vez que este efecto ya no ocurre, la capacidad de respuesta del formulario es aún lenta.
En el diseñador de Visual Studio obtengo el mismo efecto, especialmente notable cuando muevo los controles alrededor. A veces, el dibujo del formulario se detiene por completo durante uno o dos segundos, lo que hace que trabajar con BackgroundImage sea un arrastre total, tanto en el diseñador como en la aplicación resultante.
Por supuesto, traté de usar DoubleBuffered = true, y también lo configuré en todos los controles usando reflexión, sin ningún efecto.
Además, aquí está el código de carga de formularios porque es un poco inusual. Copia todos los controles de otra forma en el formulario actual. Esto se hace para poder editar el aspecto visual de cada pantalla por separado utilizando el diseñador mientras se comparte una forma común y una base de código común. Tengo la corazonada de que puede ser la causa de las ralentizaciones, pero aún no explica por qué las ralentizaciones ya son evidentes en el diseñador.
private void LoadControls(Form form)
{
this.SuspendLayout();
this.DoubleBuffered = true;
EnableDoubleBuffering(this.Controls);
this.BackgroundImage = form.BackgroundImage;
this.BackColor = form.BackColor;
this.Controls.Clear();
foreach (Control c in form.Controls)
{
this.Controls.Add(c);
}
this.ResumeLayout();
}
Como se puede ver, SuspendLayout()
y ResumeLayout()
se utilizan para evitar volver a dibujar innecesario.
Aún así, la forma es "lenta como el infierno" una vez que se utiliza una imagen de fondo. Incluso traté de convertirlo a PNG, JPG y BMP para ver si eso marca alguna diferencia. Además, la imagen tiene un tamaño de 1024x768, pero las imágenes más pequeñas tienen el mismo efecto de desaceleración (aunque un poco menos).
¿Qué debo hacer?
Si está utilizando una versión de VS con el generador de perfiles incluido, ¿dónde dice el perfilador que está gastando todo su tiempo? –
posible duplicado de [Cómo corregir el parpadeo en los controles de usuario] (http://stackoverflow.com/questions/2612487/how-to-fix-the-flickering-in-user-controls) –