如何知道FrameworkElement何时被完全呈现?

时间:2015-12-17 16:55:28

标签: c# xaml winrt-xaml uwp

对于WPF,ContentRendered类中有Window事件,它告诉我们何时呈现了视觉元素。

有什么能帮助我实现UWP应用的相同结果吗?我想知道FrameworkElement何时被完全呈现,所以我可以在此之后触发一些动作。我不认为Loaded事件对此有帮助,因为它在屏幕上显示任何内容之前就已触发。

2 个答案:

答案 0 :(得分:9)

我会从Loaded开始。它可能比你想象的更好。

  

https://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.frameworkelement.loaded

     

Loaded事件可以用作连接来自模板的元素的事件处理程序的点,或者用于调用依赖于应用模板结果的子元素存在的逻辑。 Loaded是首选的对象生命周期事件,用于在显示UI的XAML控件之前使用应用程序代码操作元素树结构。如果在初始布局中没有其他事件也发生(在初始布局上确实发生了SizeChanged),那么从Loaded处理程序调用VisualStateManager.GoToState方法以设置模板中定义的初始视图状态也是合适的。

根据您的使用情况,请考虑使用LayoutUpdated。

  

https://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.frameworkelement.layoutupdated

     

LayoutUpdated是控件准备好进行交互之前在XAML加载序列中发生的最后一个对象生存期事件。但是,LayoutUpdated也可以在对象生存期内的运行时发生,原因有多种:属性更改,窗口大小调整或运行时布局请求(UpdateLayout或更改的控件模板)。布局序列中的所有SizeChanged事件发生后,将触发LayoutUpdated事件。

此外,您可以考虑使用SizeChanged。

  

https://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.frameworkelement.sizechanged

     

当应用程序首次激活时,在页面元素的初始布局期间发生SizeChanged,因为在布局发生之前,UI元素的ActualHeight和ActualWidth值未定义。它们仅在初始布局过程中获取值,因此发生SizeChanged事件。此后,在应用程序的生命周期内,如果ActualHeight和ActualWidth值因其他原因发生更改,则SizeChanged事件可以再次从元素触发。

你的问题确实没有给我太多的帮助,但不管你的用例如何,我打赌这会非常接近。话虽这么说,你也可能要等到渲染完成。一个众所周知的解决方案是将(在控件的Loaded事件中)一个动作发送给调度程序,它将等待执行直到渲染完成。如果这是您想要的,请尝试使用此代码的变体:

Dispatcher.Invoke(new Action(() => { }), DispatcherPriority.ContextIdle, null);

祝你好运!

答案 1 :(得分:3)

在类似情况下,这对我来说效果很好:

    ...
    await Dispatcher.RunAsync(CoreDispatcherPriority.Low, DoYourThing);
    ...

    private void DoYourThing()
    {

    }