4

我需要将 Window 的内容存储到图像中,保存并关闭窗口。如果我在 Loaded 事件上关闭窗口,则图像包含窗口,其中一些项目绘制正常,其他一些仅绘制一半或扭曲,而其他则不在图像上。

如果我设置一个计时器并在一段时间后关闭窗口(取决于窗口的复杂性,介于 250 毫秒和 1 秒之间),图像都可以。

看起来窗口需要一些时间才能完全呈现自己。有没有办法知道何时完成此渲染以避免使用 Timer 并在我们知道它已完成渲染时关闭窗口?

谢谢。

4

3 回答 3

12

我认为您正在寻找ContentRendered事件

于 2012-04-26T09:19:04.167 回答
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;
        }
于 2012-04-26T10:00:43.550 回答
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
        }
    }
}

这是我发现在不引用 Window 的情况下从控件可靠地工作的唯一方法。

于 2016-12-19T09:05:50.273 回答