BackRequested 在 UWP 应用程序中多次触发
BackRequested is triggering more than once in UWP app
我有一个主要有 webview 的应用程序。我有问题。我已经制作了后退按钮以转到 webview 的上一个网页,它工作正常,当它没有以前的页面时,它会使用 MessageBox(Popup) 退出。问题是当我导航另一个页面并按回它递归触发后退按钮事件并显示 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));
}
而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;
}
};
为了让它更清楚,例如当我打开应用程序时,webview 导航到 www.example.com 然后按照那里的链接我将到达其他页面(例如 www.example.com/link/firstlink).然后我会将我的框架导航到 blankpage1,然后我会从那里按回。然后返回到上一页 (www.example.com/link/firstlink) 它回到起始页 (www.example.com) 并显示退出弹出窗口我该如何解决这个问题?
谢谢大家的回放。
您的问题是您仍然保留事件处理程序:在您的代码中,当从 BlankPage1 导航回来时,两个 .BackRequested 处理程序都会被调用。您需要在离开时从 MainPage 上的 .BackRequested 注销,例如:
主页:
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 上也是如此...虽然在您的 App.xaml.cs 中注册 BackRequested
会容易得多,您可以在其中处理整个应用程序的 (Window.Current.Content as Frame)
像这样。要使其 "nice" 代码也具有接口:
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。
我有一个主要有 webview 的应用程序。我有问题。我已经制作了后退按钮以转到 webview 的上一个网页,它工作正常,当它没有以前的页面时,它会使用 MessageBox(Popup) 退出。问题是当我导航另一个页面并按回它递归触发后退按钮事件并显示 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));
}
而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;
}
};
为了让它更清楚,例如当我打开应用程序时,webview 导航到 www.example.com 然后按照那里的链接我将到达其他页面(例如 www.example.com/link/firstlink).然后我会将我的框架导航到 blankpage1,然后我会从那里按回。然后返回到上一页 (www.example.com/link/firstlink) 它回到起始页 (www.example.com) 并显示退出弹出窗口我该如何解决这个问题?
谢谢大家的回放。
您的问题是您仍然保留事件处理程序:在您的代码中,当从 BlankPage1 导航回来时,两个 .BackRequested 处理程序都会被调用。您需要在离开时从 MainPage 上的 .BackRequested 注销,例如:
主页:
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 上也是如此...虽然在您的 App.xaml.cs 中注册 BackRequested
会容易得多,您可以在其中处理整个应用程序的 (Window.Current.Content as Frame)
像这样。要使其 "nice" 代码也具有接口:
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。