C# WP8确定页面导航历史记录

C# WP8确定页面导航历史记录,c#,windows-phone-7,windows-phone-8,windows-phone,C#,Windows Phone 7,Windows Phone 8,Windows Phone,在我的windows phone 8应用程序中,我在页面间导航。说 从MainPage(一些用户控制点击)->Page1然后按键,我将再次回到主页 从MainPage(一些用户控件b单击)->Page2,然后再次按键返回MainPage,依次返回page3、page4等 在这里,我想确定从哪个页面加载主页 说page1、page2或page3,基于此,我想根据导航历史加载用户控件 我在库中找不到任何内置属性或函数 任何帮助,我都在寻找实现此类功能的最佳实践。您可以使用back stack实现此类

在我的windows phone 8应用程序中,我在页面间导航。说

MainPage
(一些用户控制点击)->Page1然后按键,我将再次回到主页

MainPage
(一些用户控件b单击)->Page2,然后再次按键返回MainPage,依次返回page3page4

在这里,我想确定从哪个页面加载主页

page1page2page3,基于此,我想根据导航历史加载用户控件

我在库中找不到任何内置属性或函数


任何帮助,我都在寻找实现此类功能的最佳实践。

您可以使用back stack实现此类目的

另见: 您可以创建一个

enum PageType
{
    NONE,
    PAGE_1,
    PAGE_2,
    PAGE_3,
    PAGE_4
}
然后在您的
主页
中,您可以将ivar设置为

private PageType pageType = PageType.NONE;
然后当你移动到一个页面时,你可以设置它

pageType = PageType.PAGE_!;
NavigationService.Navigate(new Uri("Page1.xaml", UriKind.Relative));
当你回到
MainPage
时,你就可以拥有这个了

protected override void OnNavigatedTo(NavigationEventArgs e)
{
    base.OnNavigatedTo(e);

    if (e.NavigationMode == NavigationMode.Back)
    {
        switch (pageType)
        {
            case PageType.NONE:
                //Your code
                break;
            case PageType.PAGE_1:
                //Your code
                break;
            case PageType.PAGE_2:
                //Your code
                break;
            case PageType.PAGE_3:
                //Your code
                break;
            case PageType.PAGE_4:
                //Your code
                break;
        }
    }
}

编辑

然后可以使用导航上下文

在您的用户控件中

NavigationService.Navigate(new Uri("Page1.xaml?PAGE_TYPE=Page1", UriKind.Relative));
在你的主页上

protected override void OnNavigatedTo(NavigationEventArgs e)
{
    base.OnNavigatedTo(e);

    if (e.NavigationMode == NavigationMode.Back)
    {
        String pageType = null;
        NavigationContext.QueryString.TryGetValue("PAGE_TYPE", out pageType);
        if (pageType == "Page1")
        {
            //Your code
        }
    }
}
使哈希表成为全局的

Hashtable ht = new Hashtable();
ht.Add("page1");
NavigationService.Navigate(new Uri("Page1.xaml", UriKind.Relative));
似乎不包含您需要的信息以及随附的参数

所以不幸的是,似乎没有内置功能来满足您的需求

但是,您可以做的是保留用户的最后一页(以处理墓碑场景)。例如,它可能在AppSettings中,下面是一个伪代码:

public class WhateverYouWantLastPagePersister
{
    private const string LastPageID = "LastPage";

    public string GetLastPage()
    {
        string lastPage = string.Empty;
        IsolatedStorageSettings.ApplicationSettings.TryGetValue<string>(LastPageID, out lastPage);
        return lastPage;
    }

    public void PersistLastPage(string lastPage)
    {
        IsolatedStorageSettings.ApplicationSettings[LastPageID] = lastPage;
    }
}
所有需要保留最后访问的页面的页面都必须从中派生出来(因此第1页、第2页…)

最后,您可以使用
WhateverYouWantLastPagePersister
.GetLastPage()
获取所需内容

当然,在这些伪代码示例中:

  • lastPage可以是您想要的任何类型(字符串、枚举、int等) 在…,您只需要一个适当的自定义转换器,将字符串转换为您想要的任何内容
  • CustomMethodToExtractPageNameFromUri
    是一个简单的字符串解析器
  • 无论您想要什么样的stplagepersister
    都可以是静态类,一个单例,注入DI框架,这取决于您
如果您必须知道您来自哪个页面,您可以使用。在辅助页面中,覆盖OnBackKeyPress并设置值

protected override void OnBackKeyPress(System.ComponentModel.CancelEventArgs e)
{
    base.OnBackKeyPress(e);
    PhoneApplicationService.Current.State["LastPage"] = this; 
}
然后在主页中,您将覆盖OnNavigatedTo并检查状态值

protected override void OnNavigatedTo(NavigationEventArgs e)
{
    object lastPage;
    if((e.NavigationMode == NavigationMode.Back) &&
        (PhoneApplicationService.Current.State.TryGetValue("LastPage", out lastPage)))
    {
        // we navigated back and we know what the last page was!
        var pageName = lastPage.GetType().Name;
        if (pageName == "Page1")
        {
            // do something!
        }
    }
}

导航回主页时只需传递参数,可能枚举类型包含“page1”“page2”…

您可以有一个全局变量。在导航到主页之前,您需要使用pagename更改其值。没有直接给出导航的最后一页的内置功能?请阅读编辑,如果您能给出一个示例,那将非常好。这将非常简单,但我不是直接从主页导航,我从主页中的用户控件导航,点击我正在加载不同的页面。我会在页面导航时创建一个事件,但我在应用程序中有很多用户控件。@在我编辑答案之后。我不确定
NavigationContext
从页面返回时是否保留该值。请尝试此方法,如果有效,则很好,如果无效,则在
单例
类中使用上述解决方案。@sunder通过使用后堆栈,您可以获得上一页。你还需要什么?我不需要在后堆栈中的前几页。我需要从哪个页面我从后面的堆栈。假设我从主页的用户控件点击事件导航到第2页。然后从这里回来,我从第二页回来。希望你现在明白这个问题了?@sunder不确定我是否还明白你的意思。后堆栈跟踪您的导航历史记录。如果从page2到mainpage,可以使用mainpage的OnNavigatedTo方法中的back stack,查看用户来自page2。
protected override void OnNavigatedTo(NavigationEventArgs e)
{
    object lastPage;
    if((e.NavigationMode == NavigationMode.Back) &&
        (PhoneApplicationService.Current.State.TryGetValue("LastPage", out lastPage)))
    {
        // we navigated back and we know what the last page was!
        var pageName = lastPage.GetType().Name;
        if (pageName == "Page1")
        {
            // do something!
        }
    }
}