WinRT的 - 如何忽略或从浏览历史中删除页面(WinRT - How to ignore or

2019-08-01 03:00发布

我在WinRT中的地铁(C# - XAML)以下情况的应用:

用户启动应用程序时,他或她不登录。在菜单栏中我有按钮,它们定位到购物车。 它一提的是,他们可以点击它,无论登录/退出状态是很重要的。

所以我有这样的:

Home Page - > Login Page - > Shopping Cart

而一切都很正常,但是当我尝试我的购物车页面上按BACK按钮我导航回到登录页面,这是有意义的,因为页面是在我的浏览历史。 但我不希望出现这种情况,我想用户返回到首页 ,并跳过登录页面。

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

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

Answer 1:

您可以以不同的方式接近它。 你可以把它所以后面按钮多次向后导航,直到到达主页或通过登录页面跳过。 你也可以将登录页面的东西,显示了导航的外Frame -无论是在一个弹出窗口或在应用程序中的不同层。

*更新

在8.1的平台上推出的BackStackForwardStack上的属性Frame ,您可以操控。



Answer 2:

我知道这是旧的,但由于谷歌找到了这个网页对我来说,也许别人会也找到这个网页。

答案,而一个有效的变通,不回答这个问题。

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

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

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


Answer 3:

有一个在你的项目的共同文件夹中的文件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();
        } 


Answer 4:

您可以拨打GoHome()Back按钮的事件,那将带你到HomePage或应用程序的第一页。



Answer 5:

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

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

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);
            }
        }
    }
}


Answer 6:

当加载页面使用

this.NavigationCacheMode = NavigationCacheMode.Disabled;


Answer 7:

为了从栈中弹出:

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;
}


文章来源: WinRT - How to ignore or delete page from navigation history