2010-10-12 102 views
5

每當我的程序通過墓碑關閉,當它被重新激活時,我希望應用程序導航回到開始屏幕。導航在應用程序激活Windows Phone 7(墓碑)

我願做這樣的事情

private void Application_Activated(object sender, ActivatedEventArgs e) { NavigationService.Navigate(new Uri("/Start.xaml", UriKind.Relative));
}

,但它不工作。謝謝,舒爾曼。

回答

5

這不是墓碑周圍普遍接受的行爲。期望的是,應用程序應該完全返回到用戶離開時的狀態。請記住,邏輯刪除可能是除了用戶在應用程序內發起的操作之外的其他結果。例如,作爲用戶,我不希望應用程序忘記我輸入的所有信息,並且僅僅因爲我接聽了電話而返回到前一個屏幕。

如果你真的想這樣做,它如何完成將取決於你的應用程序的結構和導航層次結構。

你最好打賭可能是建立你自己的導航系統。
如果您想使用內置後退堆棧。您的Application_Activated事件可以設置一個全局標誌,所有頁面將在其OnNavigatedTo事件中選取,然後通過向後導航進行響應。這種向後導航可能對用戶可見(如果只是簡要地)並且創建不太理想的體驗。

更新
它現在可以做這樣的事情使用Non-Linear Navigation Service

2

我第二個馬特,這不是MSFT指南推薦的行爲。 WP7用戶會希望應用程序能正確地被墳墓扔石頭。

如果您仍然嚴格執行此操作,請使用NavigationService.GoBack()多次瀏覽。 從技術上講,WP7會保留您已經在系統中完成的所有頁面轉換,並且您可以編程回到主頁。您可能需要等待NavigationCompleted事件,然後調用下一個GoBack()並調用它,直到NavigationService.CanGoBack爲false,這將成爲您的主頁:)

0

正如@Matt Lacey所說,這幾乎是絕對的你不應該這樣做:你可能會落在市場certification guidelines也犯規:

5.2.3應用程序響應之後被停用

了Windows Phone應用程序 停用當用戶按下 開始按鈕或者如果設備超時 導致鎖定屏幕參與。 A 當Windows Phone應用程序調用Launcher 或Chooser API時,它也會被取消激活。激活後, 應用程序啓動時間必須符合第5.2.1節中的 要求。

微軟建議應用程序重新建立的 用戶 經歷的申請 停用之前的應用程序的狀態。有關更多信息,請參閱 Windows Phone主題的執行模型概述。

你在做什麼樣的應用?很難調用回到開始屏幕是否合適,而不瞭解更多信息或程序的上下文。

+0

作爲參考,許多應用程序(特別是遊戲)在市場上可用,在停用後不會重新建立狀態。這是一個建議,而不是一個規則。但是,是的,作爲一個用戶,當應用程序不保存狀態時,這是非常令人沮喪的。 – 2010-12-22 09:23:05

0

我們遇到了同樣的問題,轉換大型遺留項目,需要採取tomstoning一些自由。我們對這個平臺都比較陌生,所以請一定要聽取這些建議。我們的啓動頁面是SplashPage.xaml。我們使用UriMapper從上次電流源重定向:

private void Application_Activated(object sender, ActivatedEventArgs e) { 
     IsTombstoned = ! e.IsApplicationInstancePreserved; 

     if (IsTombstoned) { 
      //the os wants to return to the last page, but we want it to restart to our splash page 
      RootFrame.UriMapper = new RestartUriMapper(); 
     } 
    } 

這重定向到SplashPage.xaml,然後我們做其他的導航以清除操作系統想要去到最後一頁(可能是唯一的,我們的導航執行。)

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

     if (NavigationContext.QueryString.ContainsKey("restart")) { 
      var app = Application.Current as App; 
      //a page redirect mapper was installed to get here from tombstone - reinstate the AssociationUriMapper now 
      app.RootFrame.UriMapper = App.Root.AssociationUriMapper; 

      //from tombstone, the last current nav source is still state, so force an initial navigation back to 
      //a new instance of this splash page and proceed start up from there 
      App.PageNavigation.Navigate(@"/Pages/SplashPage.xaml?fromtomb=true"); 
     } 
    } 


class RestartUriMapper : UriMapperBase { 
    Uri restartUri; 

    public RestartUriMapper() { 
     restartUri = new Uri(string.Format("/Pages/SplashPage.xaml?restart={0}", true.ToString()), UriKind.Relative); 
    } 

    public override Uri MapUri(Uri uri) { 
     if (restartUri != null) { 
      Uri nextPageUri = restartUri; 
      restartUri = null; 
      return nextPageUri; 
     } 

     return uri; 
    } 
} 
2

不要聽這些做誰引述guidlines 哈欠社會改良

試試這個

private void Application_Activated(object sender, ActivatedEventArgs e) 
{ 
    RootFrame.Navigated += RootFrame_Navigated; 
} 

void RootFrame_Navigated(object sender, NavigationEventArgs e) 
{ 
    RootFrame.Navigated -= RootFrame_Navigated; 
    RootFrame.Navigate(new Uri("/TestPage.xaml", UriKind.Relative)); 
}