c# - rapido - historial de navegacion ver
WinRT: cómo ignorar o eliminar una página del historial de navegación (7)
Hay un archivo LayoutAwarePage.cs en la carpeta Common 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();
}
Tengo la siguiente situación en mi aplicación WinRT metro (c # - xaml):
El usuario inicia la aplicación y 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.
Entonces tengo esto:
Home Page - > Login Page - > Shopping Cart
Y todo funciona bien, pero cuando intento presionar el botón ATRÁS en la página de mi carrito de compras, vuelvo a la página de inicio de sesión , lo cual tiene sentido, porque la página está en mi historial de navegación. Pero no quiero eso, quiero regresar al usuario a la 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 Frame Navigation Stack 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 .
Puede llamar a GoHome()
en el evento del botón Back
, que lo llevará a HomePage
o a la primera página de la aplicación.
Para hacer pop desde la pila:
NavigationService.RemoveBackEntry();
Para navegar al menú principal, toca el botón Atrás:
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 Atrás:
protected override void OnBackKeyPress(System.ComponentModel.CancelEventArgs e)
{
// cancel the navigation
e.Cancel = true;
}
Sé que es viejo, pero como Google encontró esta página para mí, tal vez alguien más encuentre esta 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);
}
}
Puedes acercarte a él 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 podría hacer que la página de inicio de sesión muestre algo que se muestre fuera del Frame
navegación, ya sea en una ventana emergente o en una capa diferente en la aplicación.
*Actualizar
En 8.1, la plataforma introdujo las propiedades BackStack
y ForwardStack
en el Frame
que puede manipular.
Al cargar el uso de la página
this.NavigationCacheMode = NavigationCacheMode.Disabled;
Escribí mi propio servicio de navegación de seguimiento de la historia. Puedes encontrarlo aquí .
En caso de que mueva el archivo o lo elimine, 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);
}
}
}
}