wpf wpf-controls winforms-interop

Problema de repintado de WPF



wpf-controls winforms-interop (2)

Estoy teniendo un problema con el repintado de mi control WPF.

El control WPF se agrega como ElementHost.Child para un formulario de Windows.

Cuando Windows 7 entra en modo de ahorro de energía y vuelve a la normalidad (moviendo el mouse o presionando una tecla en el teclado), el resto de los controles de formulario de Windows se repintan, sin embargo, la parte WPF no se vuelve a pintar (y el fondo de Win 7 es visible en esa area).

En Minimizar y maximizar la aplicación, la parte WPF está repintada.

¿Alguien tiene alguna idea sobre este problema?


La solución para este problema fue proporcionada en la revista MSDN hace un tiempo. Muestra cómo puede hacer que sus aplicaciones WPF sean "conscientes de la energía", es decir, que respondan a las notificaciones de energía. Es un artículo increíble y un "must-read".

Revise este enlace: haga que sus aplicaciones WPF estén a la última.

Puede explorar el código fuente en línea o descargarlo desde aquí: Código para PowerAware

Tecnologías utilizadas:

  • WPF
  • .Net Framework 3.0
  • Windows Vista / Windows XP

Por lo general, en las formas de Windows, llamar a .Invalidate () en un Control hará que se vuelva a pintar a sí mismo (mediante la configuración de la validación de todo el control a "sucia" y luego dejar que invoque su propio evento de pintura de forma asincrónica. - Si solo invoca el Paint En las formas de ganar sin Invalidar primero, solo podrá volver a dibujar la parte que estaba marcada como sucia, ya que Windows utiliza el enfoque de Rectángulos sucios para ahorrar tiempo de redibujado.)

Esperamos que pueda llamar a .Invalidate () en su control de host de WPF o simplemente llamar a .Invalidate () en el formulario en sí (por ejemplo, "this.Invalidate ();")

Habilitar el doble búfer en su formulario también puede ayudar, pero no estoy seguro de esto, aunque vale la pena el experimento.

@Hasan anterior le dio parte de la respuesta: cómo conectarse a Windows Message Pump, que recibe notificaciones de eventos de Windows Power, pero por sí solo no hará que su ventana se vuelva a pintar (al menos por lo que puedo decir). es más una notificación que dice "hey, estás a punto de tener ese problema que odias. Es una mierda que seas tú".

Por lo tanto, esto es probablemente tan simple como enlazar cosas de la bomba de mensajes de Hasan y luego llamar "this.Invalidate ()"; Cada vez que se recibe una notificación de evento de energía. Aunque esa solución puede ser un poco exagerada.

Si eso no es suficiente, puede que tenga que decirle al control de WPF que no valide ... lo que no puede hacer, porque no tiene ese método. La documentación sugiere que .InvalidateVisual () es el equivalente, pero mi experiencia me ha llevado a creer lo contrario. Aparte de invalidar a nivel de winform, no puedo ayudarte. Si encuentras la respuesta, por favor publícala!