我在WinRT中的地铁(C# - XAML)以下情况的应用:
用户启动应用程序时,他或她不登录。在菜单栏中我有按钮,它们定位到购物车。 它一提的是,他们可以点击它,无论登录/退出状态是很重要的。
所以我有这样的:
Home Page - > Login Page - > Shopping Cart
而一切都很正常,但是当我尝试我的购物车页面上按BACK按钮我导航回到登录页面,这是有意义的,因为页面是在我的浏览历史。 但我不希望出现这种情况,我想用户返回到首页 ,并跳过登录页面。
我的问题是如何做到这一点,以及如何在WinRT的操作框架导航堆栈。 我试图要回两次,但没有运气。
顺便说一句,我的网页是“LayoutAwarePage”页面,我使用的NavigationService与此类似http://dotnetbyexample.blogspot.com/2012/06/navigationservice-for-winrt.html 。
您可以以不同的方式接近它。 你可以把它所以后面按钮多次向后导航,直到到达主页或通过登录页面跳过。 你也可以将登录页面的东西,显示了导航的外Frame
-无论是在一个弹出窗口或在应用程序中的不同层。
*更新
在8.1的平台上推出的BackStack
和ForwardStack
上的属性Frame
,您可以操控。
我知道这是旧的,但由于谷歌找到了这个网页对我来说,也许别人会也找到这个网页。
答案,而一个有效的变通,不回答这个问题。
您可以在登录页上使用此,从后面堆栈中删除。
if(login_was_successful == true)
{
this.Frame.Navigate(typeof(ShoppingCard));
if(this.Frame.CanGoBack)
{
this.Frame.BackStack.RemoveAt(0);
}
}
有一个在你的项目的共同文件夹中的文件LayoutAwarePage.cs。 您可以更改此文件中的后退按钮行为。
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();
}
您可以拨打GoHome()
的Back
按钮的事件,那将带你到HomePage
或应用程序的第一页。
我写我自己的历史跟踪导航服务。 你可以找到它在这里 。
如果我移动文件或删除它,这里的当前版本:
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);
}
}
}
}
当加载页面使用
this.NavigationCacheMode = NavigationCacheMode.Disabled;
为了从栈中弹出:
NavigationService.RemoveBackEntry();
导航到主菜单触摸后退按钮:
protected override void OnBackKeyPress(System.ComponentModel.CancelEventArgs e)
{
NavigationService. Navigate (new Uri ("/Main Page. xaml", UriKind.Relative));
}
为了保持在即使他们接触后退按钮主菜单中的用户:
protected override void OnBackKeyPress(System.ComponentModel.CancelEventArgs e)
{
// cancel the navigation
e.Cancel = true;
}