【问题标题】:Exit application on "Back" button on WP7在 WP7 上的“返回”按钮上退出应用程序
【发布时间】:2011-07-29 16:02:46
【问题描述】:

我知道在 WP7 中不可能以编程方式退出应用程序。那么我该如何处理以下需求? 我的 MainPage 是空的,唯一的目的是进行测试: 如果用户从未填写首选项页面,则重定向到 Page_B.xaml(一个收集他的首选项的页面,例如语言和运行应用程序所需的其他信息)。否则重定向到 Page_A.xaml。 因此,用户显示的第一页是 Page_A 或 Page_B(取决于这是他/她第一次运行应用程序)。

这是问题所在: 当用户在 Page_A 或 Page_B 中选择硬件“返回”按钮时,我想退出应用程序。相反,他被重定向到 mainPage,它什么也没显示。 因此,当用户在 Page_A 或 Page_B (OnBackKeyPress()) 中选择“返回”时,或者更一般地,当用户使用“后退”按钮进入 MainPage.xaml 时,我需要退出应用程序。 有没有办法在不显示空 MainPage.xaml 的情况下退出应用程序? 谢谢你的建议。 埃米利奥

这是 MainPage.xaml 中的简化代码:

public MainPage(){
            InitializeComponent();
            if (phoneAppService.State.TryGetValue("currentLanguage", out someObject))
            {  // Yes: go on
                var uri = "/Pages/Page_A.xaml";
                this.Dispatcher.BeginInvoke(() => this.NavigationService.Navigate(new Uri(uri, UriKind.Relative)));
            }
            else
            {  // No: select language before proceeding
                var uri = "/Pages/Page_B.xaml";
                this.Dispatcher.BeginInvoke( () => this.NavigationService.Navigate(new Uri(uri, UriKind.Relative)));
            }
}

    **// if previous page was Page_A or Page_B then exit application**
    protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
    {
       string sourcePage = "";  
       if (NavigationContext.QueryString.TryGetValue("from", out sourcePage)) {
            if ((string.Compare(sourcePage.ToString(), "Page_A")) == 0 ? true : false) {
                **// EXIT APPLICATION**
            }
            if ((string.Compare(sourcePage.ToString(), "Page_B")) == 0 ? true : false) {
                **// EXIT APPLICATION**
            }
       } 
        base.OnNavigatedTo(e);
    }

Page_A.xaml 有以下代码将信息发送到 MainPage。

// Back Button pressed: notify MainPage so it can exit application
protected override void OnBackKeyPress(System.ComponentModel.CancelEventArgs e)
{
NavigationService.Navigate(new Uri(uri, UriKind.Relative));
base.OnBackKeyPress(e);
}

Page_B.xaml 有以下代码将信息发送到 MainPage。

// Back Button pressed: notify MainPage so it can exit application
  protected override void OnBackKeyPress(System.ComponentModel.CancelEventArgs e)
        {
            var uri = "/MainPage.xaml?from=Page_B";
            NavigationService.Navigate(new Uri(uri, UriKind.Relative));
            base.OnBackKeyPress(e);
        }

【问题讨论】:

    标签: windows-phone-7 button exit back


    【解决方案1】:

    这是一个相当常见的场景,要么在第一次运行应用程序时执行一次性任务,要么您需要登录才能使用该应用程序。与其把它写成一个完整的页面,我建议将一个 UserControl 放在你主页上的全屏弹出窗口中。这样一来,单次后退键将始终退出您的应用。

    【讨论】:

    • +1 - 我认为这比我建议的方法更好!
    • 非常感谢!我会听从你的建议!问候
    【解决方案2】:

    您可能想要重组您的应用程序。根本没有 MainPage,总是加载 PageA。如果用户没有设置首选项,只需将他们重定向到 PageB,他们将设置首选项并点击返回按钮,将他们带回 PageA。由于应用程序现在具有所需的设置,因此可以正常显示 PageA。

    如果你真的必须使用 3 页方案,你可以让NonLinear Navigation Service 发挥它的魔力。

    【讨论】:

      【解决方案3】:

      您可以通过例如在 App 类上有一个静态布尔变量,例如ForceExitApplication 并在 Page_A 或 Page_B 上将此设置为 true。在 MainPage 你会检查这个变量,如果它设置为 true 你退出应用程序:

      • 通过调用 NavigationService.GoBack() (我认为这会 工作)
      • 或者通过抛出异常(这会起作用,但肯定会 市场提交失败)

      但是,我会在实施这种行为方面有所不同。您试图实现的目标(在主页面以外的位置退出应用程序)似乎违反了 WP7 指南,如果是这样,您的应用程序在提交时可能会被拒绝,直到您解决此问题。

      【讨论】:

      • 如果变量为真,如何退出应用程序?
      • 通过调用 NavigationService.GoBack() - 我认为这会起作用,尽管必须尝试 - 或者不会让您的应用程序获得认证但会起作用的方法会引发异常。
      • 但是调用 NavigationService.GoBack() 会从主页抛出。
      【解决方案4】:

      在 Mango 中,您可以使用以下方法:

      在 app.cs 中为 RootFrame.Navigated 事件添加事件处理程序:

       RootFrame.Navigated += RootFrame_Navigated;
      

      然后在事件处理程序中,我们可以利用导航回栈:

      void RootFrame_Navigated(object sender, NavigationEventArgs e)
      {
          var pageBURI = "/Pages/Page_B.xaml";
          var pageAURI = "/Pages/Page_A.xaml";
      
          if ((e.Uri == pageAURI || e.Uri == pageBURI) && RootFrame.BackStack.Count() > 0)
          {
              RootFrame.RemoveBackEntry();
          }
      }
      

      这段代码有什么作用: 首先,我们检查是否导航到页面 A 或 B。然后我们检查是否在导航回栈中有任何页面。 (应该至少是一个,因为我们已经从 mainPage 重定向了)。然后,我们从 backstack 日志中删除最后一个条目。现在,用户将按下“返回”按钮,应用程序将退出。

      您可以在此处阅读有关 BackStack 的更多信息:http://msdn.microsoft.com/en-us/library/hh394012(v=vs.92).aspx

      【讨论】:

        【解决方案5】:

        大多数页面的可视化树中的根项目是一个网格。将您的两个 UI 组织到由堆栈面板托管的两个网格中并将每个 UI 的可见性绑定到页面依赖项属性以便此属性控制哪个可见是微不足道的。没有理由一个页面不能同时满足这两个目的。

        【讨论】:

          猜你喜欢
          • 2012-11-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-06-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多