De hecho, resolví esto, pero lo voy a publicar para la posteridad.
Me encontré con un problema muy extraño con DataGridView en mi sistema de doble monitor. El problema se manifiesta como un repintado EXTREMADAMENTE lento del control ( como 30 segundos para un repintado completo ), pero solo cuando está en una de mis pantallas. Cuando por el otro lado, la velocidad de repintado es buena.
Tengo una Nvidia 8800 GT con los últimos controladores no beta (175. algo). ¿Es un error de controlador? Lo dejaré en el aire, ya que tengo que vivir con esta configuración en particular. (Sin embargo, no sucede con las tarjetas ATI ...)
La velocidad de pintura no tiene nada que ver con el contenido de la celda, y el dibujo personalizado no mejora el rendimiento en absoluto, incluso cuando solo se pinta un rectángulo sólido.
Más tarde descubrí que colocar un ElementHost (del espacio de nombres System.Windows.Forms.Integration) en el formulario corrige el problema. No tiene por qué meterse con él; solo necesita ser un elemento secundario del formulario en el que también se encuentra DataGridView. Se puede cambiar el tamaño a (0, 0) siempre que la propiedad Visible sea verdadera.
No quiero agregar explícitamente la dependencia .NET 3 / 3.5 a mi aplicación; Hago un método para crear este control en tiempo de ejecución (si puede) usando la reflexión. Funciona, y al menos falla correctamente en máquinas que no tienen la biblioteca requerida, simplemente vuelve a ser lento.
Este método también me permite aplicar para corregir mientras la aplicación se está ejecutando, lo que facilita ver qué están cambiando las bibliotecas de WPF en mi formulario (usando Spy ++).
Después de muchas pruebas y errores, noté que habilitar el almacenamiento en búfer doble en el control en sí (en lugar de solo en el formulario) corrige el problema.
Por lo tanto, solo necesita crear una clase personalizada basada en DataGridView para poder habilitar su DoubleBuffering. ¡Eso es!
class CustomDataGridView: DataGridView
{
public CustomDataGridView()
{
DoubleBuffered = true;
}
}
Siempre que todas mis instancias de la cuadrícula estén usando esta versión personalizada, todo está bien. Si alguna vez me encuentro con una situación causada por esto en la que no puedo usar la solución de subclase (si no tengo el código), supongo que podría intentar inyectar ese control en el formulario :) ( aunque yo ' Será más probable que intente usar la reflexión para forzar la propiedad DoubleBuffered desde el exterior para evitar una vez más la dependencia ).
Es triste que algo tan trivialmente simple haya consumido tanto de mi tiempo ...