在WPF中,当我加载包含很多元素的包装面板时,窗口会停顿一会儿,然后再显示内容。我想添加一个等待提示,但是找不到一种方法来检测包装面板何时完成渲染。
我尝试“加载”,“大小更改”,“初始化”没有成功。有人对这个问题有任何想法吗?
非常感谢!
答案 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
}