我需要将 Window 的内容存储到图像中,保存并关闭窗口。如果我在 Loaded 事件上关闭窗口,则图像包含窗口,其中一些项目绘制正常,其他一些仅绘制一半或扭曲,而其他则不在图像上。
如果我设置一个计时器并在一段时间后关闭窗口(取决于窗口的复杂性,介于 250 毫秒和 1 秒之间),图像都可以。
看起来窗口需要一些时间才能完全呈现自己。有没有办法知道何时完成此渲染以避免使用 Timer 并在我们知道它已完成渲染时关闭窗口?
谢谢。
我认为您正在寻找ContentRendered事件
我在我正在工作的应用程序中遇到了类似的问题,我通过使用以下代码解决了它,尝试一下,如果它有帮助,请告诉我。
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;
}
我在 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
}
}
}
这是我发现在不引用 Window 的情况下从控件可靠地工作的唯一方法。