2017-02-19 37 views
0

私は、ほんの一握りのページでかなり単純なWPFアプリケーションを持っています。 フォームの送信時に、特定のページに移動してから最後のナビゲーションエントリを消去して、ユーザーが今送信したフォームを再送信できないようにしたいと考えています。WPF NavigationService "RemoveBackEntry"は最も新しいエントリではなく、最も古いエントリを削除しています

しかし、特定のページに移動した後にナビゲーションサービスで「RemoveBackEntry()」を呼び出すと、私のページではなく、バックスタックの3番目のエントリ(この場合は最も古い)が削除されますからナビゲート。そのページは、新しいページが読み込まれたときに、バックスタック内の最新のエントリとして残ります。

これは私のコードですが、これは非常に簡単で簡単です。

public void NavigateToNewWorkPage() 
    { 
     _view.NavigationService?.Navigate(new WorkPage()); 
     _view.NavigationService?.RemoveBackEntry(); 
    } 

答えて

2

私は同じ問題を抱えており、NavigationServiceが提供するイベントを使用して解決しました。

NavigationService.Navigate(..)メソッドは非同期で、RemoveBackEntry()に電話すると、現在のビューはまだバックエントリジャーナルには含まれていません。したがって、ナビゲートする前に最後のバックエントリだったビューを削除します。あなたはこのようにそれを解決することができます:

public void NavigateToNewWorkPage() 
{ 
    if (_view.NavigationService != null) 
    { 
     _view.NavigationService.Navigated += NavServiceOnNavigated; 
     _view.NavigationService.Navigate(new WorkPage()); 
    } 
} 

private void NavServiceOnNavigated(object sender, NavigationEventArgs args) 
{ 
    _view.NavigationService.RemoveBackEntry(); 
    _view.NavigationService.Navigated -= NavServiceOnNavigated; 
} 

あなたから移動ビューが最後のバックエントリになりましたので、あなたがナビゲートイベントを待ってから、あなたはそれを削除します。

+0

私は実際に私のapp.xaml.csにnavigatedイベントを追加しました。それから、私はバックスタックにアクセスできます。私はスピンして、私が削除しようとしている特定のエントリを削除します。 あなたの名前を最も近いと回答しました。ありがとう! –

1

私はそれを試していませんが、RemoveBackEntry()への呼び出しをルーピングできますか?例えば。

public void NavigateToNewWorkPage() 
{ 
    _view.NavigationService?.Navigate(new WorkPage()); 

    while(_view.NavigationService?.CanGoBack == true) 
    { 
     _view.NavigationService?.RemoveBackEntry(); 
    } 
} 
関連する問題