在WPF中,是否存在“渲染完成”事件?

时间:2018-09-04 09:03:56

标签: wpf

在WPF中,当我加载包含很多元素的包装面板时,窗口会停顿一会儿,然后再显示内容。我想添加一个等待提示,但是找不到一种方法来检测包装面板何时完成渲染。

我尝试“加载”,“大小更改”,“初始化”没有成功。有人对这个问题有任何想法吗?

非常感谢!

4 个答案:

答案 0 :(得分:2)

是的,使用Window.ContentRendered event

答案 1 :(得分:0)

您可以重写OnRender方法以检测何时完成渲染。

要推送所有事件,请在其中将DoEvents作为扩展方法实现的dall Dispatcher.DoEvents():

public static class DispatcherExtensions
{
    public static void DoEvents(this Dispatcher dispatcher, DispatcherPriority priority = DispatcherPriority.Background)
    {
        DispatcherFrame frame = new DispatcherFrame();
        dispatcher.BeginInvoke(priority, (Action<DispatcherFrame>)ExitFrame, frame);
        Dispatcher.PushFrame(frame);
    }

    private static void ExitFrame(DispatcherFrame frame)
    {
        frame.Continue = false;
    }
}

答案 2 :(得分:0)

我知道这时这个问题有点老了,但是我碰到了同样的问题,并且找到了一个不错的方法,认为这可以在将来对其他人有所帮助。在渲染开始时,使用ContextIdle的Dispatcher Priority调用Dispatcher.BeginInvoke。我开始渲染时刚巧是一个Treeview选中的项目更改事件,但这可能是您需要等待UI完成更新的任何事件。

    private void TreeView_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
    {
        Dispatcher.BeginInvoke(new Action(() => DoSomething()), DispatcherPriority.ContextIdle, null);
    }

    private void DoSomething()
    {
       //This will get called after the UI is complete rendering
    }

答案 3 :(得分:0)

好吧,您可以像这样向渲染事件添加方法:

public MainWindow()
{
    InitializeComponent();
    CompositionTarget.Rendering += afertRendering;
}

void afertRendering(object sender, EventArgs e)
{
    //What you want to do after rendering
}