0

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

MainPage某些用户控制单击到)-> Page1然后按一下键它将带我再次返回主页

MainPage某些用户控件 b 单击到)-> Page2然后再次按下按键返回主页面,依此类推到page3page4等。

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

根据我想根据导航历史加载用户控件说page1page2page3 。

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

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

4

6 回答 6

0

Just pass parameters when you are navigating back to main page, maybe an enum type contains 'page1' 'page2' ...

于 2013-10-18T18:26:47.267 回答
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!
        }
    }
}
于 2013-10-18T17:05:49.957 回答
0

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

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

但是,您可以做的是保留用户访问过的最后一页(以处理墓碑场景)。例如它可能在 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 可以是您想要的任何类型(字符串、枚举、int 等......),您只需要一个适当的自定义转换器,从字符串到您想要的任何类型
  • CustomMethodToExtractPageNameFromUri是一个简单的字符串解析器
  • WhateverYouWantLastPagePersister可以是静态类,单例,注入DI框架,由你决定!
于 2013-10-18T08:17:03.223 回答
0

您可以将后堆栈用于此类目的。

如何使用 Windows Phone 的后台堆栈进行导航

另请参阅: https ://stackoverflow.com/a/7000977/942286

于 2013-10-18T06:42:19.833 回答
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
        }
    }
}
于 2013-10-18T06:47:30.003 回答
0

使哈希表全局化。

Hashtable ht = new Hashtable();
ht.Add("page1");
NavigationService.Navigate(new Uri("Page1.xaml", UriKind.Relative));
于 2013-10-18T06:55:54.913 回答