加载的事件没有完全加载

时间:2011-06-28 18:01:15

标签: silverlight windows-phone-7

我觉得很傻,但我找不到答案。假设我想在MainPage加载时向用户显示一些消息。问题是,如果我在Loaded事件(MessageBox.Show())上执行此操作,弹出窗口会在我的页面加载之前显示,这会使用户留下此消息和黑色背景。这是一种沉闷的情况。任何事件的想法可以做到这一点。还有其他方法,比如后台工作者或者NavigationInTransition_EndTransition事件,但应该有更优雅的方式吗?

5 个答案:

答案 0 :(得分:7)

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

在页面构造函数中:

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()。

如果您的网页与我的网页相似,那么您会得到类似的内容:

  1. 的OnNavigatedTo
  2. LayoutUpdated
  3. 加载
  4. LayoutUpdated
  5. 已加载 - > BeginInvoke的
  6. 多次LayoutUpdated
  7. 最后的LayoutUpdated将是最佳候选者,但如何检测它?因此,“Loaded - > BeginInvoke”似乎是琐碎的选择中的最佳选择。

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

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

答案 1 :(得分:1)

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

http://www.scottlogic.co.uk/blog/colin/2011/01/windows-phone-7-deferredloadcontentcontrol/

答案 2 :(得分:1)

您可以在LoadedEvent中使用DispatcherTimer在一秒左右后触发。

答案 3 :(得分:1)

尝试Page.OnNavigatedTo而不是Loaded。

答案 4 :(得分:0)

您还可以将其附加到其中一个控件的Loaded事件中。

我不确定你在后台想要拥有什么(整个页面?),但是将它添加到你想要显示的任何控件中可能会有效。