2016-08-20 78 views
0

我在我的應用程序中重寫BackButton並顯示MessageDialog。如何取消任務?

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(); 
     } 

enter image description here

導航到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'覆蓋會更好。 –