在OnNavigatedTo之后执行代码

时间:2012-05-08 08:56:27

标签: windows-phone-7 navigation windows-phone-7.1

我有代码从其他页面获取IdUs​​ers

String IdUsers;

        public Main_Wallets_Page()
        {
            InitializeComponent();            
            MessageBox.Show(IdUsers);
        }


protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
        {
            String Id;
            if (NavigationContext.QueryString.TryGetValue("IdUsers", out Id))
                IdUsers = Id;
        }

MessageBox总是空的。我希望MessageBox在OnNavigationTo之后显示“IdUsers”(不要将MessageBox放在“OnNavigationTo”中)。

我该怎么做?

3 个答案:

答案 0 :(得分:3)

你不应该在OnNavigatedTo中使用MessageBoxes,因为如果用户没有按下按钮,你的应用程序就会崩溃,因为框架认为导航失败了。构造函数中的MessageBoxes同样糟糕。

我可以想到两个选项(我对这些事情使用#1):

  1. Loaded事件中显示MessageBox。但要小心它可以 不止一次发射。在构造函数中,您可以为Loaded事件添加处理程序,然后在处理程序中从处理程序中分离,以便只调用一次。

  2. Dispatcher.BeginInvoke电话周围使用MessageBox.Show,以便它不会阻止导航。这可能仍会阻止Dispatcher线程。如果你真的想走这条路线,你可以使用ThreadPool.QueueUserWorkItemTPL Task

  3. 我也使用OnLayoutUpdated代替Loaded事件,但我不记得确切原因:)似乎可能是页面尚未显示在{{ 1}}并且它在另一个事件中。

答案 1 :(得分:2)

如果初始化了此值,则可以将其存储在应用程序隔离存储中。然后,当调用构造函数时,您可以从那里读取它。在这种情况下,将初始化用户ID的值,并且MessageBox不会显示NULL。

答案 2 :(得分:2)

请勿MessageBox置于OnNavigatedTo事件中。 尝试使用MainPagePage2创建一个空项目。在MainPage上放置按钮以导航至Page2。在Page2地点MessageBox OnNavigatedTo地点Page2然后,如果从VS开始调试,everythig将正常工作。但是,如果您部署并运行它,您会看到当导航到MessageBox时,您会看到MessageBox。然后不要做任何事情,只需等待大约15秒。 Canceled将作为Page2做出反应,应用程序将会崩溃!,不会导航到MainPageDispatcher.BeginInvoke。如果您在MessageBox.Show周围使用OnNavigatedTo,则会发生同样的情况。 我假设MessageBox事件有超时,仅在部署应用程序时才有效。因此,您应该在导航竞争时运行protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e) { base.OnNavigatedTo(e); var lcTimer = new DispatcherTimer { Interval = new TimeSpan(0, 0, 0, 0, 200) }; lcTimer.Tick += (s2, e2) => { (s2 as DispatcherTimer).Stop(); if (MessageBoxResult.OK == MessageBox.Show("Test, don't push", "", MessageBoxButton.OKCancel)) MessageBox.Show("OK"); else MessageBox.Show("Cancel"); }; lcTimer.Start(); } 。 如果你做的话,一切都有效

OnNavigatedTo

注意:如果您在OnNavigatedTo末尾的ThreadPool.QueueUserWorkItem代码中运行了一些代码。

我喜欢Austin Thompson(upvote)为Dispatcher.BeginInvoke提供的建议。但请注意,使用此方法,您需要将MessageBox放在protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e) { base.OnNavigatedTo(e); ThreadPool.QueueUserWorkItem((stateInfo) => { Dispatcher.BeginInvoke(() => { if (MessageBoxResult.OK == MessageBox.Show("Test don't push", "", MessageBoxButton.OKCancel)) MessageBox.Show("OK"); else MessageBox.Show("Cancel"); }); }); } 内,否则您将收到跨线程异常。所以代码如下

{{1}}