在我的Windows Phone 8應用程序中,我正在瀏覽頁面。說WP8確定頁面導航歷史
從MainPage
(一些用戶控制點擊) - >第1頁然後用一個按鍵就帶我到主頁再次
從MainPage
(一些用戶對照組B點擊) - >第2頁,然後用按鍵來主頁面再次等來3頁,第4頁等
這裏我想確定從哪個頁面加載主頁面?
說第1頁,第2頁或基於我想根據導航歷史加載用戶控件3頁。
我在庫中找不到任何內置屬性或函數。
任何幫助,我正在尋找最佳實踐以及實現這樣的功能。
在我的Windows Phone 8應用程序中,我正在瀏覽頁面。說WP8確定頁面導航歷史
從MainPage
(一些用戶控制點擊) - >第1頁然後用一個按鍵就帶我到主頁再次
從MainPage
(一些用戶對照組B點擊) - >第2頁,然後用按鍵來主頁面再次等來3頁,第4頁等
這裏我想確定從哪個頁面加載主頁面?
說第1頁,第2頁或基於我想根據導航歷史加載用戶控件3頁。
我在庫中找不到任何內置屬性或函數。
任何幫助,我正在尋找最佳實踐以及實現這樣的功能。
您可以使用back stack來達到這種目的。
您可以創建一個
enum PageType
{
NONE,
PAGE_1,
PAGE_2,
PAGE_3,
PAGE_4
}
然後在你的MainPage
你可以有一個伊娃作爲
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));
在你的MainPage
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
}
}
}
這將是非常容易的,但我不是直接從主頁面導航,我從主頁面上的用戶控件導航,我加載不同的頁面。我會在頁面導航時創建一個事件,但我在應用程序中有很多用戶控件。 – sunder
@sunder我編輯了我的答案。我不確定當從頁面返回時NavigationContext是否保留了值。請嘗試這個,如果它的工作,那麼好,如果不是,那麼在一個'Singleton'類中使用上面的解決方案。 –
讓哈希表全球。
Hashtable ht = new Hashtable();
ht.Add("page1");
NavigationService.Navigate(new Uri("Page1.xaml", UriKind.Relative));
看來,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));
}
}
所有頁面需要堅持在上次訪問的網頁必須從它派生的(所以第一頁,第二頁...)
最後,你可以使用WhateverYouWantLastPagePersister
.GetLastPage()
得到你所需要的。
當然,這些僞代碼示例:
CustomMethodToExtractPageNameFromUri
是一個簡單的字符串解析器WhateverYouWantLastPagePersister
可以是靜態類,一個單身,與DI框架注入,這是給你!如果您必須知道您來自哪個頁面,則可以使用PhoneApplicationService.Current.State。在您的二級頁面,覆蓋OnBackKeyPress並在的MainPage設置的值
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更改其值。 – Anand
沒有內置的功能,直接給出哪個是您導航的最後一頁? – sunder
請閱讀編輯,如果你能舉一個例子,那將會很棒。 – sunder