在我的 windows phone 8 应用程序中,我在页面之间导航。说
从MainPage(某些用户控制单击到)-> Page1然后按一下键它将带我再次返回主页
从MainPage(某些用户控件 b 单击到)-> Page2然后再次按下按键返回主页面,依此类推到page3、page4等。
在这里我想确定主页是从哪个页面加载的?
根据我想根据导航历史加载用户控件说page1、page2或page3 。
我在库中找不到任何内置属性或函数。
任何帮助,我也在寻找最佳实践来实现这样的功能。
在我的 windows phone 8 应用程序中,我在页面之间导航。说
从MainPage(某些用户控制单击到)-> Page1然后按一下键它将带我再次返回主页
从MainPage(某些用户控件 b 单击到)-> Page2然后再次按下按键返回主页面,依此类推到page3、page4等。
在这里我想确定主页是从哪个页面加载的?
根据我想根据导航历史加载用户控件说page1、page2或page3 。
我在库中找不到任何内置属性或函数。
任何帮助,我也在寻找最佳实践来实现这样的功能。
Just pass parameters when you are navigating back to main page, maybe an enum type contains 'page1' 'page2' ...
如果您必须知道您来自哪个页面,您可以使用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!
}
}
}
似乎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()
当然,在这些伪代码示例中:
CustomMethodToExtractPageNameFromUri是一个简单的字符串解析器WhateverYouWantLastPagePersister可以是静态类,单例,注入DI框架,由你决定!您可以创建一个
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
}
}
}
使哈希表全局化。
Hashtable ht = new Hashtable();
ht.Add("page1");
NavigationService.Navigate(new Uri("Page1.xaml", UriKind.Relative));