Silverlight 已加载的事件未完全加载

Silverlight 已加载的事件未完全加载,silverlight,windows-phone-7,Silverlight,Windows Phone 7,我觉得很傻,但我就是找不到答案。假设我想在主页加载时向用户显示一些消息。问题是,如果在加载事件(MessageBox.Show())时执行此操作,则在加载页面之前会显示弹出窗口,这会给用户留下此消息和黑色背景。这是一种沉闷的情况。任何关于哪项活动能起作用的想法。还有其他方法,如后台工作程序或NavigationTransition\u EndTransition事件,但应该有更优雅的方法?如果加载的为您提前触发,您可以尝试LayoutUpdate。每次发生布局过程时都会触发此事件,并且通常会在加

我觉得很傻,但我就是找不到答案。假设我想在主页加载时向用户显示一些消息。问题是,如果在加载事件(MessageBox.Show())时执行此操作,则在加载页面之前会显示弹出窗口,这会给用户留下此消息和黑色背景。这是一种沉闷的情况。任何关于哪项活动能起作用的想法。还有其他方法,如后台工作程序或NavigationTransition\u EndTransition事件,但应该有更优雅的方法?

如果加载的
为您提前触发,您可以尝试
LayoutUpdate
。每次发生布局过程时都会触发此事件,并且通常会在加载后触发。但是,您应该记住在不再需要时取消订阅此活动。我在我创建的
DeferredLoadContentControl
中使用此事件:


您可以使用LoadedEvent中的Dispatcher在大约一秒钟后触发。

您还可以将其附加到某个控件的已加载事件


我不确定您希望在后台显示什么(整个页面?),但将其添加到您希望显示的任何控件中可能会起作用。

尝试page.on导航,而不是加载。

您可以轻松测试所有标准方法。我花的时间比写这篇文章要少

在页面构造函数中:

Loaded += new RoutedEventHandler(TestPage_Loaded);
LayoutUpdated += new EventHandler(TestPage_LayoutUpdated);
各自的方法:

    void TestPage_LayoutUpdated(object sender, EventArgs e)
    {
        Debug.WriteLine("LayoutUpdated");
    }

    void TestPage_Loaded(object sender, RoutedEventArgs e)
    {
        Debug.WriteLine("Loaded");
        Dispatcher.BeginInvoke(() =>
        {
            Debug.WriteLine("Loaded -> BeginInvoke");
        });
    }
还向OnNavigateTo()添加调试写入

如果您的页面与我的页面类似复杂,那么您会得到如下结果:

  • 导航到
  • 布局更新
  • 装载
  • 布局更新
  • 已加载->开始刷新
  • 多次更新布局
  • Last LayoutUpdated将是最佳候选,但如何检测它呢?因此,“Loaded->BeginInvoke”似乎是琐碎的选项中的最佳选项

    您还可以使用页面上单个组件的已加载事件。这也很简单。它们有时可能发生在第4步和第5步之间


    如果以上选项都没有帮助(我不这么认为),您必须使用非标准逻辑。例如上面提到的一次性计时器,它在一段时间后显示消息。或者根据LayoutUpdated计数器建立逻辑。

    不确定这是否适用于WP7,但请尝试一下:
    Dispatcher.BeginInvoke(新操作(委托(){MessageBox.Show(“Hello”);})谢谢你的建议。它将完成这项工作。事实上,NavigationTransition和EndTransition的情况差不多,我猜它产生的结果也差不多。尽管如此,我还是想知道为什么没有一个页面事件适合这个任务。LayoutUpdate会根据布局的复杂性触发多次。它通常在加载事件之前第一次激发。没错,我使用LayoutUpdate的标准方法是,每次激发时,检查我需要定位的元素是否存在于可视树中。当我可以找到我想要的控件时,我会取消订阅。出于好奇,我只是尝试覆盖OnNavigatedTo,但它仍然发生在页面加载之前,因此在加载期间显示消息框的效果相同。Shawn,OnNavigatedTo在加载之前被激发,我需要最后一个可能的事件。不确定,但是值得一试……老实说,我可能不会使用MessageBox,而是显示一个弹出窗口,这样顺序就不重要了。但那就是我。谢谢你对这个问题的清晰解释和解决方法。我就把它留在这里(一些额外的信息)。