1

コードに他のページから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は常にNullになります。メッセージボックスにOnNavigationToの後に「IdUsers」を表示したい(メッセージボックスを「OnNavigationTo」に入れないでください)。

どうすればいいですか?

4

3 に答える 3

3

OnNavigatedTo で MessageBoxes を使用しないでください。ユーザーがボタンを押さないと、フレームワークがナビゲーションが失敗したと判断してアプリがクラッシュするためです。コンストラクターの MessageBoxes も同様に悪いです。

2 つのオプションを考えることができます (私はこれらの種類のものに #1 を使用します)。

  1. イベントで MessageBox を表示しLoadedます。ただし、複数回発射される可能性があることに注意してください。コンストラクターで Loaded イベントのハンドラーを追加してから、ハンドラーでハンドラーから切り離して、一度だけ呼び出されるようにします。

  2. ナビゲーションを妨げないようDispatcher.BeginInvokeに、通話の周囲で使用します。MessageBox.Showそれでも Dispatcher スレッドがブロックされる可能性があります。本当にこのルートに行きたい場合は、ThreadPool.QueueUserWorkItemまたはTPL Taskを使用できます。

OnLayoutUpdatedイベントの代わりに も使用しましたが、Loaded正確な理由は思い出せません :) ページがまだ表示されておらずLoaded、他のイベントに表示されているようです。

于 2012-05-08T16:33:47.820 に答える
2

イベントに配置MessageBoxないでください。OnNavigatedToで空のプロジェクトを作成してみてください。ボタンを に配置して、 に移動します。イベントでその場で。次に、VS からデバッグを開始すると、すべてが正常に機能します。しかし、デプロイして実行すると、ナビゲートすると が表示されます。その後は何もせず、15秒ほど待ちます。として反応し、アプリケーションがクラッシュします! またはへのナビゲーションなし。の周りで使用しても同じことが起こります。イベントには、アプリがデプロイされたときにのみ機能するタイムアウトがあると想定しています。したがって、実行する必要がありますMainPagePage2MainPagePage2Page2MessageBoxOnNavigatedToPage2MessageBoxMessageBoxCanceledPage2MainPageDispatcher.BeginInvokeMessageBox.ShowOnNavigatedToMessageBoxナビ完了時。あなたがすればすべてがうまくいく

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");
        });
    });
}
于 2012-10-27T13:01:36.880 に答える
2

この値が初期化されている場合は、アプリケーション分離ストレージに格納できます。次に、コンストラクターが呼び出されると、そこから読み取ることができます。この場合、ユーザー ID の値は初期化され、MessageBox は NULL を表示しません。

于 2012-05-08T09:04:18.423 に答える