BackRequested запускается более одного раза в приложении UWP

У меня есть приложение, в котором у меня в основном есть веб-просмотр. у меня проблема. я сделал кнопку «Назад», чтобы перейти на предыдущую веб-страницу веб-просмотра, она работает нормально, и когда у нее нет предыдущих страниц, она закрывается с помощью MessageBox (всплывающее окно). Проблема в том, что когда я перехожу на другую страницу и нажимаю назад, она рекурсивно запускает событие кнопки «Назад» и показывает MessageBox

 Windows.UI.Core.SystemNavigationManager.GetForCurrentView().BackRequested += (s, e) =>
        {
            e.Handled = true;
            if (Web_view.CanGoBack)
            {
                Web_view.GoBack();
                e.Handled = true;
            }
           else
            {
                quit();
                e.Handled = true;
            }
        };

Выше приведен код моей главной страницы

 private async void quit()
    {
        MessageDialog msg = new MessageDialog("Do you really want to quit?", "Quit");
        msg.Commands.Add(new UICommand("Yes") { Id = 0 });
        msg.Commands.Add(new UICommand("No") { Id = 1 });
        var ans = await msg.ShowAsync();
        if(ans.Id.Equals(0))
        {
            //System.Diagnostics.Debug.WriteLine("Exit");
            App.Current.Exit();
        }
    }

это код функции выхода. Я перехожу на другую страницу с помощью кода

 private void about_Click(object sender, RoutedEventArgs e)
    {
        Frame.Navigate(typeof(BlankPage1));
    }

И код backRequested для BlanckPage1

 SystemNavigationManager.GetForCurrentView().BackRequested += (s,e)=>
        {
            e.Handled = true;
           // Windows.UI.Core.SystemNavigationManager.GetForCurrentView().BackRequested -= BlankPage1_BackRequested;
           //System.Diagnostics.Debug.WriteLine("BackRequested");
            if (Frame.CanGoBack)
            {
                e.Handled = true;
                Frame.GoBack();
            }
            else
            {
                e.Handled = true;
            }
        };

Чтобы было более понятно, например, когда я открываю приложение, веб-просмотр переходит на www.example.com, а затем, следуя ссылкам, я попаду на другую страницу (например, www.example.com/link/firstlink). затем я переведу свой фрейм на пустую страницу1 и оттуда нажму назад. затем вместо возврата на предыдущую страницу (www.example.com/link/firstlink) он переходит на начальную страницу (www.example.com) и показывает всплывающее окно выхода, как я могу это исправить?

Спасибо за все ваши повторы.


person Aravind Belagaje    schedule 03.04.2017    source источник


Ответы (1)


Ваша проблема в том, что вы все еще сохраняете обработчик событий: в вашем коде при переходе назад из BlankPage1 вызываются оба обработчика .BackRequested. Вам нужно будет отменить регистрацию из .BackRequested на MainPage при выходе из него, например, так:

Главная страница:

protected override void OnNavigatedTo(NavigationEventArgs e) {
    SystemNavigationManager.GetForCurrentView().BackRequested += OnBackRequested;
}

protected override void OnNavigatedFrom(NavigationEventArgs e) {
    SystemNavigationManager.GetForCurrentView().BackRequested -= OnBackRequested;
}

private void OnBackRequested(object sender, BackRequestedEventArgs e) {
    // Your code to navigate back
    if (Web_view.CanGoBack)
    {
        Web_view.GoBack();
        e.Handled = true;
    }
    else
    {
        quit();
        e.Handled = true;
    }
}

И то же самое на BlankPage1... Хотя было бы гораздо проще зарегистрироваться на BackRequested в вашем App.xaml.cs, где вы будете обрабатывать (Window.Current.Content as Frame) для всего приложения, что-то вроде этого. Чтобы сделать "красивый" код еще и с интерфейсом:

Страница навигации:

public interface INavigationPage {
    // When overriding the method returns true or false if the Page handled back request
    bool HandleBackRequested();
}

Приложение.xaml.cs:

// ... Code before
protected override void OnLaunched(LaunchActivatedEventArgs e) {
    SystemNavigationManager.GetForCurrentView().BackRequested += OnBackRequested;
}

private void OnBackRequested(object sender, BackRequestedEventArgs e) {
    Frame frame = Window.Current.Content as Frame;
    if (frame == null) return;

    INavigationPage page = frame.Content as INavigationPage;
    if (page == null) return;

    // Ask if the page handles the back request
    if (page.HandleBackRequested()) {
        e.Handled = true;
    // If not, go back in frame
    } else if (frame.CanGoBack) {
        e.Handled = true;
        frame.GoBack();
    }
}
// ... Code after

MainPage.xaml.cs:

... class MainPage : Page, INavigationPage {
    // ... Code before

    // Implement the interface handling the backRequest here if possible
    public bool HandleBackRequested() {
        if (Web_view.CanGoBack) {
            Web_view.GoBack();
            return true;
        }
        return false;
    }

    // ... Code after
}

Тогда BlankPage не требует никакого кода и подписки на .BackRequested.

person DevAttendant    schedule 03.04.2017