Выйти из приложения на кнопку «Назад» на WP7 - PullRequest
6 голосов
/ 29 июля 2011

Я знаю, что в WP7 невозможно программно выйти из приложения. Так как я могу справиться со следующей необходимостью? Моя главная страница пуста и имеет единственную цель сделать тест: если пользователь никогда не заполнял страницу предпочтений, перенаправляет на страницу Page_B.xaml (страницу, на которой собраны его настройки, такие как язык и другая информация, необходимая для запуска приложения). В противном случае перенаправьте на Page_A.xaml. Таким образом, первая страница, которую показывает пользователь, это Page_A или Page_B (в зависимости от того, запускает ли он приложение в первый раз).

ЗДЕСЬ ПРОБЛЕМА: когда пользователь выбирает аппаратную кнопку «Назад», находясь в Page_A или Page_B, я хочу выйти из приложения. Вместо этого он перенаправляется на главную страницу, которая ничего не показывает. Поэтому мне нужно выйти из приложения, когда пользователь выбирает «Назад» в Page_A или Page_B (OnBackKeyPress ()) или, в более общем случае, когда пользователь заходит в MainPage.xaml с помощью кнопки «Назад». Есть ли способ выйти из приложения, не показывая пустой MainPage.xaml? Спасибо за совет. Emilio

вот упрощенный код в 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 ]

11 голосов
/ 29 июля 2011

Это довольно распространенный сценарий, когда одноразовая задача выполняется при первом запуске приложения или если вам нужно войти в систему, чтобы использовать приложение вообще.Вместо того, чтобы писать это как полную страницу, я бы порекомендовал поместить UserControl в полноэкранное всплывающее окно над главной страницей.Таким образом, одно нажатие клавиши «Назад» всегда будет выходить из приложения.

2 голосов
/ 11 марта 2012

В Mango вы можете использовать следующий подход:

в 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. Затем мы проверяем, есть ли у нас какие-либо страницы в backstack навигации.(Это должен быть хотя бы один, потому что мы уже были перенаправлены с mainPage).Затем мы удаляем последнюю запись из журнала backstack.Теперь пользователь нажмет кнопку «Назад», приложение закроется.

Подробнее о BackStack можно прочитать здесь: http://msdn.microsoft.com/en-us/library/hh394012(v=vs.92).aspx

2 голосов
/ 29 июля 2011

Вы можете реструктурировать свое приложение. У вас вообще нет главной страницы, всегда загружайте PageA. Если пользователь не установил предпочтения, просто перенаправьте его на PageB, он установит предпочтения и нажмет кнопку «Назад», которая вернет их обратно на PageA. Поскольку приложение теперь имеет необходимые настройки, оно может нормально отображать PageA.

Если вам действительно нужно использовать трехстраничную схему, вы можете получить Нелинейная навигационная служба , которая будет действовать по волшебству.

2 голосов
/ 29 июля 2011

Вы можете достичь этой цели, например, наличие статической логической переменной в классе App, например ForceExitApplication и установите это значение true на Page_A или Page_B. На MainPage вы бы проверили эту переменную, и если она установлена ​​в true, вы выйдете из приложения:

  • Либо путем вызова NavigationService.GoBack () (я думаю это будет работа)
  • Или с помощью исключения (это будет работать, но определенно неудачная отправка на торговую площадку)

Я бы, однако, мог бы реализовать это поведение. Похоже, что то, что вы пытаетесь достичь - выход из приложения в точке, отличной от главной страницы, - противоречит рекомендациям WP7, и если это так, ваше приложение может быть отклонено при отправке до тех пор, пока вы не исправите эту проблему.

0 голосов
/ 03 августа 2011

Корневым элементом в визуальном дереве большинства страниц является сетка.Тривиально организовать два пользовательских интерфейса в две сетки, размещенные на панели стека, и связать видимость каждого со свойством зависимости страницы, чтобы это свойство контролировало видимость.Нет причин, по которым одна страница не может служить обеим целям.

...