2012-01-16 26 views
10

的窗口,我有這樣的代碼:
Window w = // something
w.Loaded += // some code to take a screenshot of the window
w.Show();Window.loaded閃光之前滿載

Loaded事件觸發之前窗口完全加載,我得到這個圖片: Window screenshot

我可以在w.Show()之後添加一個Thread.Sleep或其他東西,但在屏幕截圖之前,我需要爲數百個窗口運行這段代碼。
我的問題是:當窗口完全加載時是否有另一個事件觸發?或者一些方法來實現這一點,而不會讓線程進入睡眠狀態。

感謝

+0

@ H.B。我需要我的項目 – 2012-01-16 21:52:28

+8

@ H.B的每個窗口的屏幕截圖。這真的不是他的問題的重點,即使是2個窗口,這個問題也是有意義的。我不想等待4秒鐘才能看到2張截圖,如果我使用過低的等待時間,我肯定不會確定我是否能夠獲得。有時你可能需要(上帝禁止)使用不同數據的同一窗口的200張截圖。我明白架構問題不容忽視,但像這樣的問題並不罕見,人們無法通過重新設計和重寫大代碼庫來修復它們。在我看來,問題是非常合理的。 – 2012-01-16 22:12:31

+0

@Nikola:我從來沒有對這個問題說過什麼...... – 2012-01-16 22:22:40

回答

22

展望在MSDN Object Lifetime Events文章中,你可以找到:

加載的事件最終渲染之前提出的,但 佈局系統之後計算出所有必要的值進行渲染。 加載意味着元素包含 的邏輯樹已完成,並連接到演示源 提供HWND和呈現表面。

您應該嘗試一些不完全符合您需要的替代事件。你應該嘗試的順序如下:

注意到,這些事件可能你的窗口的一生中觸發多次,所以用在編寫應用程序心神。

WPF是數據驅動的UI架構,以我們習慣於在WinForms中使用的方式使用它並不是很令人愉快。正如有人比我更聰明,WPF讓艱難的事情變得微不足道。

+3

對於Window.ContentRendered – 2012-01-16 22:06:14

+0

+1與第一個和第三個結果相同,第二個引發異常 – 2012-01-16 22:12:52

+0

你是什麼意思它會拋出異常?異常是否發生在你的處理程序或.NET框架中?其他兩個的結果看起來完全相同還是正確加載了窗口鑲邊?此外,請嘗試[RenderTargetBitmap.Render](http://msdn.microsoft.com/en-us/library/system.windows.media.imaging.rendertargetbitmap.render.aspx)將窗口呈現爲位圖。創建RTB類的實例,創建窗口的實例,不需要顯示它,並將窗口傳遞給Render方法。 – 2012-01-16 22:23:22