2011-05-11 8 views
16

Tengo un problema con el repintado de mi control WPF.WPF repaint problema

El control WPF se añade como un ElementHost.Child para una forma de Windows.

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

En minimizar y maximizar de la aplicación, por parte de WPF se volvió a pintar.

¿Alguien tiene alguna idea sobre este problema?

+0

No estoy seguro de si esto es posible, pero ¿puede obligar al WPF a volver a pintar mediante el enganche en el evento OnPaint de Windows? No estoy seguro de cómo funcionaría esto a través de la interoperabilidad, pero vale la pena intentarlo. http://msdn.microsoft.com/en-us/library/system.windows.forms.control.onpaint.aspx – stuartmclark

+0

No anule OnPaint, el control de host ya tiene un OnPaint funcionamiento, sólo tiene que ser se le dijo que se rediseñase, por ejemplo, llamando a Invalidate(); consulte mi publicación a continuación para obtener más información. – BrainSlugs83

Respuesta

1

La solución para este problema se proporcionó en la revista MSDN hace un tiempo. Muestra cómo puede hacer que sus aplicaciones WPF sean "conscientes del consumo de energía", es decir, que respondan a las notificaciones de energía. Es un artículo increíble y una "lectura obligada".

Comprobar este enlace: Make Your WPF Apps Power-Aware

Puede examinar el código fuente en línea o descargarlo desde aquí: Code for PowerAware

Tecnologías usadas:

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

He robado el artículo justo ahora. No estoy seguro de que el artículo trate sobre cómo actualizar la ventana, cómo escribir una función que se llamará (en la que debe insertar el código de actualización). –

0

En general, en formas de las ventanas llamando .Invalidate() en un control hará que se vuelva a pintar en sí (a través de la configuración de validación de todo el control de Rect de "sucio" y luego dejar que invocan su propio evento de dibujo de forma asíncrona. - Si sólo invoca el método de pintura en winforms sin Invalidar principio, sólo será capaz de volver a dibujar la parte que fue previamente'sucio'' - como Windows utiliza el Dirty Rectangles approach para ahorrar tiempo de redibujo)

. Con suerte, puede invocar .Invalidate() en el control de host de WPF o simplemente invocar .Invalidate() en el formulario (por ejemplo, "this.Invalidate();")

Habilitar el doble almacenamiento en memoria también puede ayudar, pero no estoy seguro de esto; sin embargo, vale la pena el experimento.

@Hasan anterior se dio parte de la respuesta - la forma de gancho en el suministro de mensajes de Windows que y recibir notificaciones de eventos ventanas de energía - pero por sí sola no hará que su ventana para volver a pintar (por lo menos de lo que pueda decir) - es más una notificación que dice "hey, estás a punto de tener ese problema que odias. Apesta ser tú".

Así que este es probablemente tan simple como conectar en cosas suministro de mensajes de Hasan y luego llamar "this.Invalidate();" cada vez que se recibe una notificación de evento de potencia. Aunque esa solución puede ser un poco exagerada.

Si eso no es suficiente que necesita hacer que el control de WPF en sí para invalidar ... lo que no puede hacer, ya que 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 en el nivel winform, no puedo ayudarte. Si encuentra la respuesta, ¡por favor publíquela!