我需要將窗口的內容存儲到圖像中,保存並關閉窗口。如果關閉Loaded事件的窗口,圖像包含窗口,其中一些項目繪製正常,其他一些只是一半繪製或扭曲,而另一些則不在圖像上。如何知道控件(或窗口)何時在WPF中呈現(繪製)?
如果我在一段時間後(根據窗口的複雜程度在250毫秒到1秒之間)放置一個計時器並關閉窗口,圖像就可以了。
看起來窗口需要一些時間才能完全呈現自身。有沒有辦法知道這個渲染何時完成,以避免使用Timer並在知道渲染已完成時關閉窗口?
謝謝。
我需要將窗口的內容存儲到圖像中,保存並關閉窗口。如果關閉Loaded事件的窗口,圖像包含窗口,其中一些項目繪製正常,其他一些只是一半繪製或扭曲,而另一些則不在圖像上。如何知道控件(或窗口)何時在WPF中呈現(繪製)?
如果我在一段時間後(根據窗口的複雜程度在250毫秒到1秒之間)放置一個計時器並關閉窗口,圖像就可以了。
看起來窗口需要一些時間才能完全呈現自身。有沒有辦法知道這個渲染何時完成,以避免使用Timer並在知道渲染已完成時關閉窗口?
謝謝。
我認爲你正在尋找ContentRendered事件
工程就像一個魅力。很好,很短,很好。謝謝 – 2012-04-30 10:14:34
我很高興它幫助:) – Dtex 2012-05-02 09:24:52
我不得不在應用程序中類似的問題,我的工作,我 解決它通過使用下面的代碼,嘗試,讓我知道,如果它幫助。
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;
}
Uf。看起來每個人都有自己的解決方案,並且沒有兩個看起來一樣。我會看看,但爲什麼你要實例化一個在任何地方都沒用過的HwndSource? – 2012-04-26 10:13:30
它強制父窗口等待,直到孩子得到渲染。這對我來說很好...... !!! – Pank 2012-04-26 10:18:17
我會嘗試,無論如何,ContentRendered事件對我來說是最簡單的方式。 – 2012-04-26 10:21:35
我在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
}
}
}
這是唯一的方法,我發現可以從控件可靠地工作,而無需引用窗口。
如何捕捉窗口的圖像? – 2012-04-26 09:28:51
使用RenderTargetBitmap類。 – 2012-04-26 09:30:32