BackRequested在UWP应用程序中触发不止一次

问题描述:

我有一个应用程序,其中我主要有一个webview。我有问题。我已经使后退按钮转到以前的网页的webview它工作正常,当它没有以前的网页时,它退出与一个MessageBox(弹出)。问题是,当我浏览其他页面,然后按回它递归触发后退按钮事件,并显示在MessageBoxBackRequested在UWP应用程序中触发不止一次

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

而且blanckPage1的backRequested代码导航到另一个页面

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)。然后我会将我的框架导航到blankpage1,然后从那里按下。然后回到前一页(www.example.com/link/firstlink),它会回到起始页面(www.example.com)并显示退出弹出窗口,我该如何解决这个问题?

谢谢你的所有重播。

你的问题是,你仍然保持事件处理程序:在你的代码从BlankPage1返回时,两个.BackRequested处理程序被调用。

的MainPage:离开它的时候,比如像这个,你需要从.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),就像这样。为了使 “好” 的代码也与接口:

INavigationPage:

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

App.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。