Windows Phone 8.1-如何处理硬件返回按钮GoBack with a Parameter返回上一页

本文关键字:按钮 返回 硬件 GoBack with 返回上一页 Parameter 处理 Phone 何处理 Windows | 更新日期: 2023-09-27 18:19:36

我有一个Windows Phone 8.1应用程序。

在一个页面上,当用户点击硬件后退按钮时,我想导航回上一页,但也想向上一页发送一个参数。但是GoBack函数不接受任何参数。如何将参数传回上一页?

这就是我目前如何处理硬件后退按钮

在我看来,构造函数

HardwareButtons.BackPressed += HardwareButtons_BackPressed;

事件处理程序

void HardwareButtons_BackPressed(object sender, BackPressedEventArgs e)
{
    Frame rootFrame = Window.Current.Content as Frame;
    if (rootFrame != null && rootFrame.CanGoBack)
    {
        rootFrame.GoBack();
        e.Handled = true;
    }
}

如果有人能为我指明正确的方向,我将非常高兴。提前感谢。

Windows Phone 8.1-如何处理硬件返回按钮GoBack with a Parameter返回上一页

我使用singleton模式解决了这个问题,我创建了一个所有移动页面都能看到的控制器类,并通过它传递消息。希望这个答案能帮助你

根据应用程序/项目的架构,有多种方法可以正确处理此问题。以下是几种可能的解决方案:

1-App.xaml.cs上的公共(静态)属性对象。这样你就可以从任何地方设置对象,并从任何地方读取它。

public sealed partial class App : Application
{
    ............
    public static SomeType SomeObjectIPreferToShareAcrossApp { get; set; }
    ............
}

然后是你的反向定价处理程序:

void HardwareButtons_BackPressed(object sender, BackPressedEventArgs e)
{
    Frame rootFrame = Window.Current.Content as Frame;
    if (rootFrame != null && rootFrame.CanGoBack)
    {
        App.SomeObjectIPreferToShareAcrossApp = this.someObjectIHaveOnlyOnThisPage;
        rootFrame.GoBack();
        e.Handled = true;
    }
}

然后,当你导航到一个页面时,检查该对象是否已设置,读取并重置

protected override void OnNavigatedTo(NavigationEventArgs e)
{
    if (e.NavigationMode == NavigationMode.Back)
    {
        if (App.SomeObjectIPreferToShareAcrossApp != null)
        {
            // yay, do something :)
            App.SomeObjectIPreferToShareAcrossApp = null;
        }
    }
}

我相信有些人会反对这种分享方式,因为它可能容易出错,而且很难看。

2-某种事件聚合器实现,这意味着您从发布者向所有订阅者发布/发送特定消息或对象。

3-共享ViewModel实例

还有其他方法,但这取决于你的项目/应用程序的架构。

创建一个具有以下内容的类:

  using System;
namespace SimpleMVVM.Model
{  
    public class Customer
    {
        public int CustomerID
        {
            get; 
            set;   
        }
        public string FullName
        {
            get;
            set;
        }
        public string Phone
        {
            get; 
            set;
        }
    }
}

然后,您可以通过页面分配/获取这些变量,而不是在页面之间发送变量。

您必须像这样控制e.Handled

        Frame rootFrame = Window.Current.Content as Frame;
        if (rootFrame != null && rootFrame.CanGoBack && !e.Handled)
        {
            rootFrame.GoBack();
            e.Handled = true;
        }

如果不控制为e.Handled,则HardwareButtons.BackPressed事件将继续向后堆栈。