2012-01-16 11 views
10

ho questo codice:
Window w = // something
w.Loaded += // some code to take a screenshot of the window
w.Show();incendi Window.loaded prima che la finestra è a pieno carico

L'evento Loaded prima che la finestra è a pieno carico e ottengo questa immagine: Window screenshot

Potrei aggiungere un Thread.Sleep o qualcosa dopo w.Show() e prima dello screenshot ma ho bisogno di eseguire questo pezzo di codice per centinaia di finestre.
La mia domanda è: c'è un altro evento che si attiva quando la finestra è completamente caricata? o un modo per ottenere ciò senza mettere il thread in sleep.

Grazie

+0

@ H.B. Ho bisogno di uno screenshot di ogni finestra del mio progetto –

+8

@ H.B. questo non è davvero il punto della sua domanda e la domanda ha senso anche per 2 finestre. Non vorrei aspettare 4 secondi per 2 screenshot, e di sicuro non mi piacerebbe essere incerto se vado a ottenere se uso un periodo di attesa troppo basso. E a volte potresti aver bisogno (dio non voglia) di 200 screenshot della stessa finestra con dati diversi. Capisco che le preoccupazioni architettoniche non devono essere ignorate, ma problemi come questo non sono rari e la gente non può correggerli ridisegnando e riscrivendo basi di codice di grandi dimensioni. A mio avviso, la domanda è molto ragionevole. –

+0

@Nikola: Non ho mai detto nulla sulla domanda ... –

risposta

22

Guardando in Object Lifetime Events articolo MSDN è possibile trovare:

L'evento Loaded è sollevato prima del rendering finale, ma dopo che il sistema di layout ha calcolato tutti i valori necessari per il rendering. Caricato comporta che l'albero logico in cui un elemento è contenuto all'interno sia completo e si connetta a un'origine di presentazione che fornisce l'HWND e la superficie di rendering.

Dovresti provare alcuni eventi alternativi che non sono esattamente adatti alle tue esigenze. Si dovrebbe cercare in seguente ordine:

Si precisa che questi eventi possono sparare più volte durante la vita della finestra, in modo da scrivere l'applicazione con quello in mente.

WPF è un'architettura UI basata sui dati e non è molto piacevole lavorare con WinForms. Come ha detto una persona più intelligente di me, WPF rende le cose difficili banali e banali.

+3

+1 per Window.ContentRendered –

+0

stesso risultato con il primo e il terzo, il secondo lancia un'eccezione –

+0

Come vuoi dire che genera un'eccezione? L'eccezione si verifica nel gestore o nel framework .NET? Il risultato di altri due sembra esattamente lo stesso o il chrome della finestra è stato caricato correttamente? Inoltre, prova [RenderTargetBitmap.Render] (http://msdn.microsoft.com/en-us/library/system.windows.media.imaging.rendertargetbitmap.render.aspx) per rendere la tua finestra su una bitmap. Crea un'istanza della classe RTB, crea un'istanza della tua finestra, non è necessario mostrarla e passa la finestra al metodo Render. –

Problemi correlati