Windows phone 7 退出申请;“后退”;WP7上的按钮

Windows phone 7 退出申请;“后退”;WP7上的按钮,windows-phone-7,button,exit,back,Windows Phone 7,Button,Exit,Back,我知道在WP7中,不可能以编程方式退出应用程序。我能满足以下需求吗? 我的主页是空的,唯一的目的是进行测试: 如果用户从未填写首选项页面,则会重定向到页面_B.xaml(收集其首选项的页面,如语言a和运行应用程序所需的其他信息)。否则,重定向到页面_A.xaml。 因此,用户显示的第一个页面是页面A或页面B(取决于他/她是否是第一次运行应用程序) 问题是: 当用户在A页或B页选择硬件“后退”按钮时,我想退出应用程序。相反,他被重定向到主页,而主页上什么也没有显示。 因此,当用户在Page_A或P

我知道在WP7中,不可能以编程方式退出应用程序。我能满足以下需求吗? 我的主页是空的,唯一的目的是进行测试: 如果用户从未填写首选项页面,则会重定向到页面_B.xaml(收集其首选项的页面,如语言a和运行应用程序所需的其他信息)。否则,重定向到页面_A.xaml。 因此,用户显示的第一个页面是页面A或页面B(取决于他/她是否是第一次运行应用程序)

问题是: 当用户在A页或B页选择硬件“后退”按钮时,我想退出应用程序。相反,他被重定向到主页,而主页上什么也没有显示。 因此,当用户在Page_A或Page_B中选择“Back”(OnBackKeyPress())时,或者更一般地,当用户使用Back按钮访问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有以下代码将信息发送到主页

// 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);
}
// 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);
        }
Page_B.xaml有以下代码将信息发送到主页

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

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


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

然而,我会对实施这种行为感到不安。您试图实现的目标(在主页以外的位置退出应用程序)似乎违反了WP7准则,如果是这样,您的应用程序在提交时可能会被拒绝,直到您解决此问题。

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


如果您真的必须使用3页的方案,您可能能够让应用程序发挥其魔力。

这是一个相当常见的场景,在应用程序第一次运行时执行一次性任务,或者如果您需要登录才能使用应用程序。与其把它写成一个完整的页面,我建议在主页上的全屏弹出窗口中放置一个UserControl。这样,只需按一次后退键即可退出应用程序。

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

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

在app.cs中,将事件处理程序添加到根框架。已导航事件:

 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页。然后我们在检查,是否在导航中有任何页面。(至少应该是一个,因为我们已经从主页重定向了)。然后,我们将从backback日志中删除最后一个条目。现在,如果用户按下“后退”按钮,应用程序将退出


您可以在此处阅读有关BackStack的更多信息:

如果变量为true,您如何退出应用程序?或者通过调用NavigationService.GoBack()-我认为这会起作用,但必须尝试一下-或者一个不会让您的应用程序通过认证但会起作用的方法会引发异常。但是调用NavigationService.GoBack()可以将从主页抛出。+1-我认为这是一个比我建议的更好的方法!非常感谢你!我会听从你的建议!当做