visual tutorial studio pagina framework wpf

tutorial - ¿Cómo corregir el cambio de tamaño de la forma WPF: los controles se retrasan y el fondo negro?



wpf vs winforms (5)

Creo que el fondo negro temporal es un problema de WPF relacionado con el hecho de que WPF utiliza DirectX como mecanismo de representación, y cuando cambia el tamaño de las ventanas, tiene que sincronizar el dibujo con el sistema de ventanas. Esto también puede explicar por qué el botón está fuera de lugar en relación con la ventana mientras se arrastra el borde de la ventana. Dibujar el área que no es del cliente de la ventana es mucho más lento que dibujar lo que está dentro de la ventana, y si mueve el mouse rápidamente en una computadora lenta, las discrepancias entre el extremo del borde y las partes internas de la ventana probablemente serán más notables.

Supuestamente, esto solo ocurre en Vista con Aero habilitado, y debería haberse solucionado en Vista SP1. Sin embargo, acabo de probar el SP2 y aún vi un poco de fondo negro, pero solo cuando Aero estaba habilitado. Mi tarjeta gráfica es bastante rápida por lo que apenas se notaba.

Si mi análisis es correcto, la única forma en que puede solucionar su problema es conseguir una tarjeta gráfica más rápida o apagar Aero.

Tengo una ventana WPF muy simple, lo único es un botón alineado a la derecha. Cuando redimensiono la ventana arrastrando el límite izquierdo, el botón salta - mucho. Pruébelo usted mismo, arrastre el límite izquierdo hacia adelante y hacia atrás.

Además, un fondo negro queda expuesto temporalmente durante el cambio de tamaño.

En this pregunta, hice una pregunta similar sobre Windows Forms. La única respuesta que obtuve sugirió que esto está arreglado en WPF, sin embargo, sorprendentemente, no solo no está arreglado, sino que WPF también agrega un segundo error visual: el fondo negro temporal.

Así es como se ve el retraso de control; esto ocurre cuando redimensiono la ventana por su borde superior (grabado con una cámara porque la tapa de la pantalla lo hace menos obvio al hacer que todo sea lento):

Ejemplo del borde negro: se capturó mientras se redimensionaba la ventana; Solo es así por una fracción de segundo, pero es muy notable:

¿Estoy haciendo algo mal? ¿Cómo puedo hacer que mis controles permanezcan visualmente en un lugar durante el cambio de tamaño? ¿Cómo puedo evitar el borde negro?

Nota : el botón termina finalmente en el lugar correcto, solo salta brevemente durante el cambio de tamaño.


Este es un código de trabajo completo basado en la segunda solución de Wieser Software Ltd.

public partial class MainView : Window { public MainView() { InitializeComponent(); //ensure win32 handle is created var handle = new WindowInteropHelper(this).EnsureHandle(); //set window background var result = SetClassLong(handle, GCL_HBRBACKGROUND, GetSysColorBrush(COLOR_WINDOW)); } public static IntPtr SetClassLong(IntPtr hWnd, int nIndex, IntPtr dwNewLong) { //check for x64 if (IntPtr.Size > 4) return SetClassLongPtr64(hWnd, nIndex, dwNewLong); else return new IntPtr(SetClassLongPtr32(hWnd, nIndex, unchecked((uint)dwNewLong.ToInt32()))); } private const int GCL_HBRBACKGROUND = -10; private const int COLOR_WINDOW = 5; [DllImport("user32.dll", EntryPoint = "SetClassLong")] public static extern uint SetClassLongPtr32(IntPtr hWnd, int nIndex, uint dwNewLong); [DllImport("user32.dll", EntryPoint = "SetClassLongPtr")] public static extern IntPtr SetClassLongPtr64(IntPtr hWnd, int nIndex, IntPtr dwNewLong); [DllImport("user32.dll")] static extern IntPtr GetSysColorBrush(int nIndex); }


Esto no parece ser posible en las versiones actuales de WPF.


Hay dos soluciones, que se describen aquí: http://wieser-software.blogspot.co.uk/2012/06/wpf-window-rendering-woes.html

  1. Enganche WndProc y maneje WM_ERASEBKGND y dibuje el sistema WINDOW_COLOR en el fondo, u otro color que se adapte a su tema de aplicación.
  2. Llame a SetClassLong para establecer el pincel de fondo de clase de ventana

    SetClassLong (Handle, GCL_HBRBACKGROUND, GetSysColorBrush (COLOR_WINDOW));


Otras respuestas han abordado cómo rellenar diferentes colores de fondo para intentar mitigar el efecto del dibujo lento de WPF.

No puedo ofrecer ninguna magia para acelerar WPF, pero puedo ofrecer una idea de de dónde viene el negro.

El error visual en su primera captura de pantalla se debe a una capa adicional de problema de cambio de tamaño que Aero agregó, y hay una solución parcial.

Estaba luchando contra el problema del feo tamaño en vivo en las aplicaciones nativas de Win32 y creé un resumen Pregunta / Respuesta que reúne 10 años de publicaciones sobre problemas de tamaño y ofrece algunas ideas nuevas (demasiado tiempo para pegar el contenido aquí en esta pregunta). Por favor mira:

¿Cómo suavizar las fluctuaciones / fluctuaciones / saltos feos al cambiar el tamaño de las ventanas, especialmente al arrastrar el borde superior / izquierdo (Win 7-10; bg, bitblt y DWM)?