2017-04-03 81 views
0

我有一個應用程序,其中我主要有一個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)並顯示退出彈出窗口,我該如何解決這個問題?

謝謝你的所有重播。

回答

0

你的問題是,你仍然保持事件處理程序:在你的代碼從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。

相關問題