我有代码从其他页面获取IdUsers
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”中)。
我该怎么做?
答案 0 :(得分:3)
你不应该在OnNavigatedTo中使用MessageBoxes,因为如果用户没有按下按钮,你的应用程序就会崩溃,因为框架认为导航失败了。构造函数中的MessageBoxes同样糟糕。
我可以想到两个选项(我对这些事情使用#1):
在Loaded
事件中显示MessageBox。但要小心它可以
不止一次发射。在构造函数中,您可以为Loaded事件添加处理程序,然后在处理程序中从处理程序中分离,以便只调用一次。
在Dispatcher.BeginInvoke
电话周围使用MessageBox.Show
,以便它不会阻止导航。这可能仍会阻止Dispatcher线程。如果你真的想走这条路线,你可以使用ThreadPool.QueueUserWorkItem
或TPL Task。
我也使用OnLayoutUpdated
代替Loaded
事件,但我不记得确切原因:)似乎可能是页面尚未显示在{{ 1}}并且它在另一个事件中。
答案 1 :(得分:2)
如果初始化了此值,则可以将其存储在应用程序隔离存储中。然后,当调用构造函数时,您可以从那里读取它。在这种情况下,将初始化用户ID的值,并且MessageBox不会显示NULL。
答案 2 :(得分:2)
请勿将MessageBox
置于OnNavigatedTo
事件中。
尝试使用MainPage
和Page2
创建一个空项目。在MainPage
上放置按钮以导航至Page2
。在Page2
地点MessageBox
OnNavigatedTo
地点Page2
然后,如果从VS开始调试,everythig将正常工作。但是,如果您部署并运行它,您会看到当导航到MessageBox
时,您会看到MessageBox
。然后不要做任何事情,只需等待大约15秒。 Canceled
将作为Page2
做出反应,应用程序将会崩溃!,不会导航到MainPage
或Dispatcher.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}}