9

我的 WinRT Metro (c# - xaml) 应用程序中有以下情况:

用户启动应用程序并且他或她没有登录。在菜单栏中,我有将他们导航到购物车的按钮。值得一提的是,无论登录/注销状态如何,他们都可以单击它。

所以我有这个:

Home Page - > Login Page - > Shopping Cart

一切都很好,但是当我尝试按购物车页面上的“返回”按钮时,我被导航回登录页面,这很有意义,因为页面在我的导航历史记录中。但我不希望这样,我想将用户返回主页并跳过登录页面。

我的问题是如何做到这一点,以及如何在 WinRT 上操作框架导航堆栈。我试过回去两次,但没有运气。

顺便说一句,我的页面是“LayoutAwarePage”页面,我正在使用类似于 http://dotnetbyexample.blogspot.com/2012/06/navigationservice-for-winrt.html的 NavigationService 。

4

6 回答 6

12

你可以用不同的方式来处理它。您可以使后退按钮多次导航,直到它到达主页或跳过登录页面。您还可以使登录页面显示在导航之外Frame- 无论是在弹出窗口中还是在应用程序的不同层中。

*更新

在 8.1 中,平台引入了BackStackForwardStack属性Frame,您可以在其上进行操作。

于 2012-10-03T20:08:29.270 回答
9

我知道它很旧,但由于谷歌为我找到了这个页面,也许其他人也会找到这个页面。

答案虽然是一种有效的解决方法,但不能回答问题。

您可以在登录页面上使用它,将其从后台堆栈中删除。

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

    if(this.Frame.CanGoBack)
    {
        this.Frame.BackStack.RemoveAt(0);
    }
}
于 2013-10-21T01:45:37.150 回答
2

在项目的 Common 文件夹中有一个 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();
        } 
于 2012-10-28T09:08:38.377 回答
0

我编写了自己的历史跟踪导航服务。你可以在这里找到它。

如果我移动文件或删除它,这是当前版本:

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);
            }
        }
    }
}
于 2015-01-06T03:57:07.727 回答
0

您可以调用GoHome()按钮Back事件,这将带您进入HomePage应用程序的第一页。

于 2012-10-28T09:11:40.947 回答
-3

从堆栈中弹出:

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;
}
于 2013-05-03T17:51:43.283 回答