2016-08-20 83 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'覆盖会更好。 –