WP8确定页面导航历史记录

时间:2013-10-18 06:22:25

标签: c# windows-phone-7 windows-phone-8 windows-phone

在我的Windows Phone 8应用程序中,我在页面之间导航。说

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

MainPage某些用户控件b点击) - &gt; Page2 ,然后再次按键再次按主页,依此类推至第3页第4页等< / p>

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

根据我想根据导航历史加载用户控件,说第1页第2页第3页

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

任何帮助,我都在寻找最佳实践来实现这样的功能。

6 个答案:

答案 0 :(得分:0)

答案 1 :(得分:0)

您可以创建

enum PageType
{
    NONE,
    PAGE_1,
    PAGE_2,
    PAGE_3,
    PAGE_4
}

然后在MainPage中,您可以使用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
        }
    }
}

答案 2 :(得分:0)

使哈希表全局化。

Hashtable ht = new Hashtable();
ht.Add("page1");
NavigationService.Navigate(new Uri("Page1.xaml", UriKind.Relative));

答案 3 :(得分:0)

似乎NavigationService不包含您需要的信息,以及NavigatingCancelEventArgs附带的OnNavigatingFrom参数。

不幸的是,似乎没有内置功能可以解决您的需求。

但是,你可以做的是坚持用户的最后一页(处理墓碑场景)。例如,它可能在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;
    }
}

要“自动”保留您上次访问过的网页,您可以从PhoneApplicationPage派生并覆盖OnNavigatingFrom以创建您自己的基页:

  public class BasePage : PhoneApplicationPage
    {
        protected override void OnNavigatedFrom(NavigationEventArgs e)
        {
            base.OnNavigatedFrom(e);
            Uri currentUri = ((App)Application.Current).RootFrame.CurrentSource;
            WhateverYouWantLastPagePersister.PersistLastPage(CustomMethodToExtractPageNameFromUri(currentUri));
        }
    }

需要保留最后访问过的页面的所有页面都必须从中派生出来(所以Page1,Page2 ......)

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

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

  • lastPage可以是您想要的任何类型(string,enum,int等) 在...),你只需要一个适当的自定义转换器,从字符串到你想要的任何东西
  • CustomMethodToExtractPageNameFromUri是一个简单的字符串解析器
  • WhateverYouWantLastPagePersister 可以是静态类,单例,注入DI框架,这取决于你!

答案 4 :(得分:0)

如果您必须知道自己来自哪个页面,则可以使用PhoneApplicationService.Current.State。在辅助页面中,覆盖OnBackKeyPress并设置值

protected override void OnBackKeyPress(System.ComponentModel.CancelEventArgs e)
{
    base.OnBackKeyPress(e);
    PhoneApplicationService.Current.State["LastPage"] = this; 
}

然后在MainPage中,您将覆盖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!
        }
    }
}

答案 5 :(得分:0)

只需在导航回主页时传递参数,也许枚举类型包含'page1''page2'...