9

WinRTメトロ(c#-xaml)アプリケーションで次の状況が発生します:

ユーザーがアプリケーションを起動しても、ログインしていません。メニューバーには、ショッピングカートに移動するためのボタンがあります。ログイン/ログアウトのステータスに関係なく、クリックできることに注意してください。

だから私はこれを持っています:

Home Page - > Login Page - > Shopping Cart

そして、すべてがうまく機能しますが、ショッピングカートページの[戻る]ボタンを押してみると、ログインページに戻ります。これは、ページがナビゲーション履歴にあるため、意味があります。しかし、私はそれを望んでいません。ユーザーをホームページに戻し、ログインページをスキップしたいと思います。

私の質問は、それを行う方法と、WinRTでフレームナビゲーションスタックを操作する方法です。私は2回戻ることを試みましたが、運がありませんでした。

ところで、私のページは「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

古いことは知っていますが、Googleがこのページを見つけたので、他の誰かがこのページを見つけるかもしれません。

答えは、有効な回避策ではありますが、質問には答えません。

ログインページでこれを使用して、バックスタックから削除できます。

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

ボタンイベントを呼び出すGoHome()と、アプリケーションの最初のページに移動します。BackHomePage

于 2012-10-28T09:11:40.947 に答える
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 に答える
-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 に答える