イベントに配置MessageBox
しないでください。とOnNavigatedTo
で空のプロジェクトを作成してみてください。ボタンを に配置して、 に移動します。イベントでその場で。次に、VS からデバッグを開始すると、すべてが正常に機能します。しかし、デプロイして実行すると、ナビゲートすると が表示されます。その後は何もせず、15秒ほど待ちます。として反応し、アプリケーションがクラッシュします! またはへのナビゲーションなし。の周りで使用しても同じことが起こります。イベントには、アプリがデプロイされたときにのみ機能するタイムアウトがあると想定しています。したがって、実行する必要がありますMainPage
Page2
MainPage
Page2
Page2
MessageBox
OnNavigatedTo
Page2
MessageBox
MessageBox
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
.
Austin Thompson(upvote) のアドバイスが気に入りましたThreadPool.QueueUserWorkItem
。ただし、このアプローチでは MessageBox を内部に配置する必要があることに注意してくださいDispatcher.BeginInvoke
。そうしないと、クロススレッド例外が発生します。したがって、コードは次のとおりです
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");
});
});
}