2012-10-03 9 views
8

He siguiente situación en mi metro WinRT (C# - xaml) aplicación:.WinRT - ¿Cómo ignorar o borrar página de la historia de navegación

usuario iniciar la aplicación y él o ella no está conectado En la barra de menú Tengo un botón que los lleva al carrito de compras. Es importante mencionar que pueden hacer clic en él independientemente del estado de inicio y cierre de sesión.

así que tengo esto:

Home Page - > Login Page - > Shopping Cart 

y todo funciona muy bien, pero cuando intento pulse el botón atrás en mi Carrito página estoy navegado de nuevo a sesión página, que tiene sentido, porque la página está en mi historial de navegación. Pero no quiero eso, quiero devolver al usuario al página de inicio y omitir la página de inicio de sesión.

Mi pregunta es cómo hacer eso, y cómo manipular la pila de navegación de marcos en WinRT. Intenté regresar dos veces, pero sin suerte.

Por cierto, mi página es la página "LayoutAwarePage" y estoy usando NavigationService similar a este http://dotnetbyexample.blogspot.com/2012/06/navigationservice-for-winrt.html.

Respuesta

12

Puede abordarlo de diferentes maneras. Puede hacer que el botón Atrás retroceda varias veces hasta que llegue a la página de inicio o se salte la página de inicio de sesión. También puede hacer que la página de inicio de sesión aparezca en el exterior de la navegación Frame, ya sea en una ventana emergente o en una capa diferente de la aplicación.

* Actualización

En la plataforma 8.1 introdujo los BackStack y ForwardStack propiedades en el Frame que se puede manipular.

2

Hay un archivo LayoutAwarePage.cs en la carpeta común de su proyecto. Puede cambiar el comportamiento del botón Atrás desde este archivo.

protected virtual void GoBack(object sender, RoutedEventArgs e) 
     { 

      while (this.Frame.CanGoBack) this.Frame.GoBack(); 

      // Use the navigation frame to return to the previous page 
      //if (this.Frame != null && this.Frame.CanGoBack) this.Frame.GoBack(); 
     } 
0

Puede llamar GoHome() en el evento de botón Back, que le llevará a HomePage o primera página de la aplicación.

+0

no hay un método '' GoHome' en Frame'. ¿Me estoy perdiendo de algo? –

+0

@AleksandarToplek Supongo que Microsoft ha cambiado la API en Win 8.1, existía hace 2 años cuando se formuló la pregunta. – Mayank

+0

Oh, eso es extraño. Todo el marco de navegación me parece incompleto. Terminé implementando la pila de historial personalizado. –

-3

hacer estallar de la pila:

NavigationService.RemoveBackEntry(); 

para navegar hasta el menú principal tocando el botón de retroceso:

protected override void OnBackKeyPress(System.ComponentModel.CancelEventArgs e) 
{ 
    NavigationService. Navigate (new Uri ("/Main Page. xaml", UriKind.Relative)); 
} 

para mantener al usuario en el menú principal, incluso si tocan el botón de retroceso:

protected override void OnBackKeyPress(System.ComponentModel.CancelEventArgs e) 
{ 
    // cancel the navigation 
    e.Cancel = true; 
} 
+0

NavigationService no existe en winrt – swinefeaster

+0

La pregunta claramente menciona que está en Windows Runtime. –

9

Sé que es viejo, pero desde que Google encontró esta página para mí, tal vez alguien más encontrará esto página también

La respuesta, si bien es válida, no responde la pregunta.

Puede usar esto en la página de inicio de sesión, eliminándolo de la pila posterior.

if(login_was_successful == true) 
{ 
    this.Frame.Navigate(typeof(ShoppingCard)); 

    if(this.Frame.CanGoBack) 
    { 
     this.Frame.BackStack.RemoveAt(0); 
    } 
} 
+1

Tengo suerte usando Frame.BackStack.Remove (Frame.BackStack.Last()) en la página de destino (por ejemplo, Carrito de la compra en este caso). – Hong

-1

Al cargar el uso página

this.NavigationCacheMode = NavigationCacheMode.Disabled; 
+0

No funciona para mí. Todavía navega hacia esa página. –

0

escribí mi propio servicio de navegación de seguimiento de la historia. Puede encontrarlo here.

En caso de que mover el archivo o eliminarlo, aquí está la versión actual:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading; 
using Windows.UI.Xaml; 
using Windows.UI.Xaml.Controls; 
using Windows.UI.Xaml.Media.Animation; 
using Windows.UI.Xaml.Navigation; 
using MetroLog; 
using SparkiyClient.UILogic.Services; 

namespace SparkiyClient.Services 
{ 
    public class NavigationService : INavigationService 
    { 
     private static readonly ILogger Log = LogManagerFactory.DefaultLogManager.GetLogger<NavigationService>(); 
     private readonly Dictionary<string, Type> pagesByKey = new Dictionary<string, Type>(); 
     private readonly Stack<PageStackEntry> historyStack = new Stack<PageStackEntry>(); 
     private PageStackEntry currentPage; 

     public string CurrentPageKey { get; private set; } 

     public bool CanGoBack => this.historyStack.Any(); 

     private static Frame GetFrame() 
     { 
      return (Frame)Window.Current.Content; 
     } 

     public void GoBack() 
     { 
      if (!this.CanGoBack) 
       return; 

      var item = this.historyStack.Pop(); 
      this.NavigateTo(item.SourcePageType.Name, item.Parameter, false); 
     } 

     public void GoHome() 
     { 
      if (!this.CanGoBack) 
       return; 

      var item = this.historyStack.Last(); 
      this.NavigateTo(item.SourcePageType.Name, item.Parameter, false); 
      this.historyStack.Clear(); 
     } 

     public void NavigateTo(string pageKey, bool addSelfToStack = true) 
     { 
      this.NavigateTo(pageKey, null, addSelfToStack); 
     } 

     public void NavigateTo<T>(bool addToStack = true) 
     { 
      this.NavigateTo<T>(null, addToStack); 
     } 

     public void NavigateTo<T>(object parameter, bool addSelfToStack = true) 
     { 
      this.NavigateTo(typeof(T).Name, parameter, addSelfToStack); 
     } 

     public void NavigateTo(string pageKey, object parameter, bool addToStack = true) 
     { 
      var lockTaken = false; 
      Dictionary<string, Type> dictionary = null; 
      try 
      { 
       Monitor.Enter(dictionary = this.pagesByKey, ref lockTaken); 
       if (!this.pagesByKey.ContainsKey(pageKey)) 
        throw new ArgumentException(string.Format("No such page: {0}. Did you forget to call NavigationService.Configure?", pageKey), "pageKey"); 

       if (addToStack && this.currentPage != null) 
        this.historyStack.Push(this.currentPage); 

       GetFrame().Navigate(this.pagesByKey[pageKey], parameter); 

       this.CurrentPageKey = pageKey; 
       this.currentPage = new PageStackEntry(this.pagesByKey[pageKey], parameter, null); 

       Log.Debug(this.historyStack.Reverse().Aggregate("null", (s, entry) => s + " > " + entry.SourcePageType.Name)); 
      } 
      finally 
      { 
       if (lockTaken && dictionary != null) 
        Monitor.Exit(dictionary); 
      } 
     } 

     public void Configure(string key, Type pageType) 
     { 
      var lockTaken = false; 
      Dictionary<string, Type> dictionary = null; 
      try 
      { 
       Monitor.Enter(dictionary = this.pagesByKey, ref lockTaken); 
       if (this.pagesByKey.ContainsKey(key)) 
        this.pagesByKey[key] = pageType; 
       else this.pagesByKey.Add(key, pageType); 
      } 
      finally 
      { 
       if (lockTaken && dictionary != null) 
        Monitor.Exit(dictionary); 
      } 
     } 
    } 
} 
Cuestiones relacionadas