在WP7上的“后退”按钮上退出应用程序

时间:2011-07-29 16:02:46

标签: windows-phone-7 button exit back

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

这是问题所在:    当用户在Page_A或Page_B中选择硬件“后退”按钮时,我想退出应用程序。相反,他被重定向到主页,它没有显示任何内容。 因此,当用户在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);
        }

5 个答案:

答案 0 :(得分:11)

这是一种相当常见的情况,要么在第一次运行应用程序时执行一次性任务,要么根据需要登录才能使用该应用程序。而不是将其写为整页我建议将UserControl放在主页上的全屏弹出窗口中。这样,单个Back键按下将始终退出您的应用程序。

答案 1 :(得分:2)

您可以通过以下方式实现此目标:在App类上有一个静态布尔变量,例如ForceExitApplication并在Page_A或Page_B上将其设置为true。在MainPage上,您将检查此变量,如果将其设置为true,则退出应用程序:

  • 通过调用NavigationService.GoBack()(我认为这会 工作)
  • 或者通过抛出异常(这会起作用,但肯定会 市场提交失败)
然而,我会改变实现这种行为。您尝试实现的目标 - 在主页以外的位置退出应用程序 - 似乎违反了WP7指南,如果是这样,您的应用程序在提交时可能会被拒绝,直到您解决此问题。

答案 2 :(得分:2)

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

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

答案 3 :(得分:2)

在芒果,您可以使用以下方法:

app.cs中的

将事件处理程序添加到RootFrame.Navigated事件:

 RootFrame.Navigated += RootFrame_Navigated;

然后在事件处理程序中,我们可以使用导航backstack:

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

答案 4 :(得分:0)

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