2016-08-20 4 views
0

私のアプリでBackButtonをオーバーライドし、MessageDialogを表示します。戻るボタンを押した場合タスクをキャンセルするには?

enter image description here

public Scenario_3() 
    { 
     this.InitializeComponent(); 
     Windows.Phone.UI.Input.HardwareButtons.BackPressed += HardwareButtons_BackPressed; 
    } 


private async void HardwareButtons_BackPresseed(object sender, BackPressedEventArgs e) 
    { 
     e.Handled = true; 
     var dialog = new MessageDialog("Do you want exit?"); 

     dialog.Commands.Add(new Windows.UI.Popups.UICommand("yes") { Id = 0 }); 
     dialog.Commands.Add(new Windows.UI.Popups.UICommand("no") { Id = 1 }); 

     dialog.DefaultCommandIndex = 0; 
     dialog.CancelCommandIndex = 1; 

     var result = await dialog.ShowAsync(); 

     if (result.Label == "yes") 
     { 
      this.Frame.Navigate(typeof(BlankPage1)); 

      ((Frame)Window.Current.Content).BackStack.Clear(); 
     } 

BlankPage1に移動した後、私は再びMessageDialogを参照してください。 移動後にこのオーバーライドをキャンセルするにはどうすればよいですか?

+2

それは良い[MCVE]と、より明確な問題の記述せずにあなたの質問を理解するのは難しいです。しかし、現在のページから移動するときに 'BackPressed'イベントから退会するのを忘れてしまったように見えます。 –

+1

ボタン/メソッドが以前に呼び出されたかどうかを確認するために、*フラグ*を使用するなどしてみましたか? – Romasz

+0

Peter Duniho、ありがとう!あなたの助けがこの問題を解決しました。 –

答えて

1

私のコメントに対するあなたの回答に基づいて、あなたはそのページから離れて移動するときにBackPressedイベントからの退会を忘れてしまったようです。そうすることで、イベントハンドラが必要なときにだけ呼び出されるようになります。例えば

private async void HardwareButtons_BackPresseed(object sender, BackPressedEventArgs e) 
{ 
    e.Handled = true; 
    var dialog = new MessageDialog("Do you want exit?"); 

    dialog.Commands.Add(new Windows.UI.Popups.UICommand("yes") { Id = 0 }); 
    dialog.Commands.Add(new Windows.UI.Popups.UICommand("no") { Id = 1 }); 

    dialog.DefaultCommandIndex = 0; 
    dialog.CancelCommandIndex = 1; 

    var result = await dialog.ShowAsync(); 

    if (result.Label == "yes") 
    { 
     // Leaving this page. Stop listening for Back button presses. 
     Windows.Phone.UI.Input.HardwareButtons.BackPressed -= HardwareButtons_BackPressed; 

     this.Frame.Navigate(typeof(BlankPage1)); 

     ((Frame)Window.Current.Content).BackStack.Clear(); 
    } 
+1

正しい。ページから移動しても、GCedされるまでイベントは引き続き受信されます。プログラムで戻ってくるコードを後で追加する場合は、 'NavigatedFrom'オーバーライドの購読を解除する方が良いでしょう。 –

関連する問題