2012-04-26 83 views
3

我需要將窗口的內容存儲到圖像中,保存並關閉窗口。如果關閉Loaded事件的窗口,圖像包含窗口,其中一些項目繪製正常,其他一些只是一半繪製或扭曲,而另一些則不在圖像上。如何知道控件(或窗口)何時在WPF中呈現(繪製)?

如果我在一段時間後(根據窗口的複雜程度在250毫秒到1秒之間)放置一個計時器並關閉窗口,圖像就可以了。

看起來窗口需要一些時間才能完全呈現自身。有沒有辦法知道這個渲染何時完成,以避免使用Timer並在知道渲染已完成時關閉窗口?

謝謝。

+0

如何捕捉窗口的圖像? – 2012-04-26 09:28:51

+0

使用RenderTargetBitmap類。 – 2012-04-26 09:30:32

回答

10

我認爲你正在尋找ContentRendered事件

+0

工程就像一個魅力。很好,很短,很好。謝謝 – 2012-04-30 10:14:34

+0

我很高興它幫助:) – Dtex 2012-05-02 09:24:52

2

我不得不在應用程序中類似的問題,我的工作,我 解決它通過使用下面的代碼,嘗試,讓我知道,如果它幫助。

using (new HwndSource(new HwndSourceParameters()) 
        { 
         RootVisual = 
          (VisualTreeHelper.GetParent(objToBeRendered) == null 
           ? objToBeRendered 
           : null) 
        }) 
     { 
      // Flush the dispatcher queue 
      objToBeRendered.Dispatcher.Invoke(DispatcherPriority.SystemIdle, new Action(() => { })); 

      var renderBitmap = new RenderTargetBitmap(requiredWidth, requiredHeight, 
                 96d*requiredWidth/actualWidth, 96d*requiredHeight/actualHeight, 
                 PixelFormats.Default); 

      renderBitmap.Render(objToBeRendered); 
      renderBitmap.Freeze();     

      return renderBitmap; 
     } 
+0

Uf。看起來每個人都有自己的解決方案,並且沒有兩個看起來一樣。我會看看,但爲什麼你要實例化一個在任何地方都沒用過的HwndSource? – 2012-04-26 10:13:30

+0

它強制父窗口等待,直到孩子得到渲染。這對我來說很好...... !!! – Pank 2012-04-26 10:18:17

+0

我會嘗試,無論如何,ContentRendered事件對我來說是最簡單的方式。 – 2012-04-26 10:21:35

0

我在SizeChanged上使用了該方法。

public partial class MyUserControl: UserControl 
{ 

    public MyUserControl() 
    { 
     InitializeComponent(); 
     SizeChanged += UserControl_DoOnce; //register 
    } 

    private void UserControl_DoOnce(object sender, SizeChangedEventArgs e) 
    { 
     if (ActualHeight > 0)//Once the object has size, it has been rendered. 
     { 
       SizeChanged -= UserControl_DoOnce; //Unregister so only done once 
     } 
    } 
} 

這是唯一的方法,我發現可以從控件可靠地工作,而無需引用窗口。

相關問題