2012-01-16 32 views
10

tengo este código:
Window w = // something
w.Loaded += // some code to take a screenshot of the window
w.Show();incendios Window.loaded antes de que la ventana está completamente cargado

Se desencadena el evento cargado antes de la ventana está completamente cargado y me sale esta imagen: Window screenshot

Podría agregar Thread.Sleep o algo así después de w.Show() y antes de la captura de pantalla pero necesito ejecutar este código para cientos de ventanas.
Mi pregunta es: ¿hay otro evento que se dispara cuando la ventana está completamente cargada? o de alguna manera para lograr esto sin poner el hilo a dormir.

Gracias

+0

@ H.B. Necesito una captura de pantalla de cada ventana en mi proyecto –

+8

@ H.B. este no es realmente el objetivo de su pregunta y la pregunta tiene sentido incluso para 2 ventanas. No me gustaría esperar 4 segundos para 2 capturas de pantalla, y estoy seguro de que no me gustaría ser incierto si voy a obtener entonces si uso un período de espera demasiado bajo. Y a veces puede necesitar (Dios no lo quiera) 200 capturas de pantalla de la misma ventana con diferentes datos. Entiendo que las preocupaciones arquitectónicas no deben ignorarse, pero problemas como este no son raros y la gente no puede solucionarlos rediseñando y reescribiendo grandes bases de código. En mi opinión, la pregunta es muy razonable. –

+0

@Nikola: Nunca he dicho nada sobre la pregunta ... –

Respuesta

22

Mirando hacia Object Lifetime Events artículo de MSDN se puede encontrar:

El evento Loaded se plantea ante el renderizado final, pero después de que el sistema de diseño ha calculado todos los valores necesarios para la representación. Cargado implica que el árbol lógico en el que está contenido un elemento está completo y se conecta a un origen de presentación que proporciona el HWND y la superficie de representación.

Debe probar algunos eventos alternativos que no son exactamente adecuados para su necesidad. Usted debe tratar en el siguiente orden:

tomar en cuenta que estos eventos pueden disparar varias veces durante la vida de la ventana, por lo que escribir una aplicación con la que, en mente.

WPF es una arquitectura de interfaz de usuario basada en datos y no es muy agradable trabajar de una manera que estamos acostumbrados en WinForms. Como alguna vez dijo alguien más inteligente que yo, WPF hace que las cosas duras sean triviales y triviales.

+3

+1 para Window.ContentRendered –

+0

mismo resultado con el primero y el tercero, el segundo arroja una excepción –

+0

¿Qué quiere decir que arroja una excepción? ¿Se produce una excepción en su controlador o en .NET framework? ¿El resultado de los otros dos es exactamente el mismo o el de Windows Chrome está cargado correctamente? Además, pruebe [RenderTargetBitmap.Render] (http://msdn.microsoft.com/en-us/library/system.windows.media.imaging.rendertargetbitmap.render.aspx) para renderizar su ventana en un mapa de bits. Cree una instancia de la clase RTB, cree una instancia de su ventana, no necesita mostrarla, y pase la ventana al método Render. –

Cuestiones relacionadas