2016-08-20 2 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, если нажать на BackButton. Как я могу отменить это переопределение после навигации?

+2

Это трудно понять ваш вопрос без хорошего [mcve] и более четкой постановки задачи. Но похоже, что вы просто забыли отказаться от подписки на событие «BackPressed» при навигации по текущей странице. –

+1

Пробовали ли вы, например, использовать * флаг *, чтобы проверить, была ли ваша кнопка/метод ранее вызвана? – Romasz

+0

Питер Дунихо, спасибо! Ваша проблема решена этой проблемой. –

ответ

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» будет еще лучше, если вы позже добавите код для программного возврата. –

Смежные вопросы