2015-07-18 21 views

回答

0

所以,最後回答我自己的問題幾個月後......

情況

每當我的應用程序使用輔助磁貼啓動時,我必須確保通過調用App.xaml.cs上的rootFrame.BackStack.Clear()來清除背堆棧。這是必要的,因爲如果在應用程序內存中存在暫停的應用程序實例,則來自輔助磁貼的導航將添加到暫掛實例所具有的任何背面堆棧的頂部。這是一個問題,因爲它會使後退按鈕返回到堆棧中的前一頁,而不是「開始」屏幕,這對於次級瓦片啓動來說是適當的行爲。

問題

如果用戶的「冷啓動」使用次平鋪,只要他/她離開它的Windows將暫停帶有明顯的後退堆棧的應用程序的該屆會議的應用。這意味着來自主磁貼的新發布將恢復從次磁貼所調用的頁面,並且按下返回按鈕將再次掛起應用程序,而不是轉到應用程序的主頁面。

解決方案

它實際上是由微軟的記載,但只以文字(https://msdn.microsoft.com/en-us/library/windows/apps/xaml/dn639128.aspx):

確保正確的後退按鈕的行爲,當您的應用程序支持多個啓動點

考慮創建新用於啓動點的導航日誌實例,例如主要和次要切片,文件和URI關聯。每次啓動應用程序時保存激活參數,並在應用程序重新啓動時進行比較。如果應用程序使用不同的參數重新啓動,請考慮創建新的導航歷史記錄。通過創建一個新的框架做到這一點。這將允許用戶在按下硬件返回鍵按鈕時快速返回到啓動點。爲了保持較小的內存佔用量,當應用程序暫停時,不需要保存除主要磁貼之外的啓動點的導航歷史記錄。

在實踐中,對我來說,這意味着寫入最後接收到的發射參數在我的應用程序的存儲一個文本文件,並在App.xaml.cs回讀的OnLaunched方法的開頭。然後我將讀取的值與當前的啓動參數進行比較。如果它們是不同的,我只是將nullrootFrame變量,從而使一個新的「導航日記」被創建:

protected override async void OnLaunched(LaunchActivatedEventArgs e) 
    { 
     ... 
     Frame rootFrame = Window.Current.Content as Frame; 
     var lastArgument = await ReadLastArgument(); 
     if (!string.Equals(lastArgument,currentArgument)) 
      rootFrame = null; 

     // Do not repeat app initialization when the Window already has content, 
     // just ensure that the window is active. 
     if (rootFrame == null){ 
     ... 
     } 
     ... 
     if (!String.IsNullOrEmpty(e.Arguments)) 
     { 
      WriteLastArgument(e.Arguments); 
      //Navigate to the page... 
      ... 
      rootFrame.BackStack.Clear(); 
     } 

    private async Task<string> ReadLastArgument() 
    { 
     StorageFolder folder = Windows.Storage.ApplicationData.Current.LocalFolder; 
     try 
     { 
      StorageFile file = await folder.GetFileAsync("lastArgument.txt"); 
      var argument = await Windows.Storage.FileIO.ReadTextAsync(file); 
      return argument; 
     } 
     catch (System.IO.FileNotFoundException) 
     { 
      return ""; 
     } 

    } 

    private async void WriteLastArgument(string argument) 
    { 
     StorageFolder folder = Windows.Storage.ApplicationData.Current.LocalFolder; 
     StorageFile file = await folder.CreateFileAsync("lastArgument.txt", CreationCollisionOption.ReplaceExisting); 
     await FileIO.WriteTextAsync(file, argument); 
    } 
} 
0

如果應用程序是從次級磁貼啓動的,則可以清除後退堆棧。

接下來按返回按鈕將使用戶回到開始屏幕。

編輯:

要清除後退堆棧:

如果在後面的頁面代碼的時候,做

Frame.BackStack.Clear(); 

做別的

var frame = Window.Current.Content as Frame; 
frame.BackStack.Clear(); 
+0

如何清除WP 8.1後退堆棧? – gabspeck

+0

@gabspeck我爲此添加了代碼。 –

+0

我應該在哪裏放置這段代碼,以便只有當頁面從輔助磁貼導航到頁面時才清除堆棧?我試圖把它放在我測試App.xaml.cs中參數的地方,但它不起作用... – gabspeck