2017-04-03 3 views
0

私は主にwebviewを持っているアプリを持っています。私は問題があります。私はwebviewの以前のWebページに戻って戻るボタンを作っています。それは正常に動作し、前のページがないときはMessageBox(ポップアップ)で終了します。問題は、私は戻って別のページやプレスを移動するとき、それは再帰的にボタンイベントをバックトリガし、メッセージボックスURPアプリでBackRequestedが2回以上トリガーされています

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コードから別のページに移動しています は、私はWebViewのはWWWにナビゲートするアプリを開いたとき例えばそれがより明確にするために

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

です。 example.comのリンクをたどって、他のページ(例:www.example.com/link/firstlink)にアクセスします。私はblankpage1に私のフレームをナビゲートし、そこから私は背を押します。それから、前のページ(www.example.com/link/firstlink)に戻ってくるのを開始したページ(www.example.com)が表示され、終了ポップアップが表示されます。これをどのように修正できますか?

ありがとうございました。

答えて

0

問題は、あなたがまだイベントハンドラを保持していることです。あなたのコードで、BlankPage1から戻ると、両方の.BackRequestedハンドラが呼び出されます。あなたはそれを離れるときに、このように、たとえば、メインページに.BackRequestedから登録解除する必要があります:

メインページ:BlankPage1上

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

と同じ... 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を購読しません。

関連する問題