如何知道WPF中何时呈现(绘制)控件(或窗口)?

时间:2012-04-26 09:12:48

标签: c# wpf drawing rendering

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

如果我放了一个计时器并在一定时间后关闭窗口(根据窗口的复杂程度,在250毫秒到1秒之间),图像都可以。

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

感谢。

3 个答案:

答案 0 :(得分:10)

我认为您正在寻找ContentRendered事件

答案 1 :(得分: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;
        }

答案 2 :(得分: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的情况下可靠地从控件中工作的唯一方法。