從輔助圖塊(即深度鏈接)啓動我的應用時,如何使硬件返回按鈕返回到系統的開始頁面?順便說一下,我使用的是XAML和C#。從輔助圖塊啓動時處理返回按鈕
回答
所以,最後回答我自己的問題幾個月後......
情況
每當我的應用程序使用輔助磁貼啓動時,我必須確保通過調用App.xaml.cs
上的rootFrame.BackStack.Clear()
來清除背堆棧。這是必要的,因爲如果在應用程序內存中存在暫停的應用程序實例,則來自輔助磁貼的導航將添加到暫掛實例所具有的任何背面堆棧的頂部。這是一個問題,因爲它會使後退按鈕返回到堆棧中的前一頁,而不是「開始」屏幕,這對於次級瓦片啓動來說是適當的行爲。
問題
如果用戶的「冷啓動」使用次平鋪,只要他/她離開它的Windows將暫停帶有明顯的後退堆棧的應用程序的該屆會議的應用。這意味着來自主磁貼的新發布將恢復從次磁貼所調用的頁面,並且按下返回按鈕將再次掛起應用程序,而不是轉到應用程序的主頁面。
解決方案
它實際上是由微軟的記載,但只以文字(https://msdn.microsoft.com/en-us/library/windows/apps/xaml/dn639128.aspx):
確保正確的後退按鈕的行爲,當您的應用程序支持多個啓動點
考慮創建新用於啓動點的導航日誌實例,例如主要和次要切片,文件和URI關聯。每次啓動應用程序時保存激活參數,並在應用程序重新啓動時進行比較。如果應用程序使用不同的參數重新啓動,請考慮創建新的導航歷史記錄。通過創建一個新的框架做到這一點。這將允許用戶在按下硬件返回鍵按鈕時快速返回到啓動點。爲了保持較小的內存佔用量,當應用程序暫停時,不需要保存除主要磁貼之外的啓動點的導航歷史記錄。
在實踐中,對我來說,這意味着寫入最後接收到的發射參數在我的應用程序的存儲一個文本文件,並在App.xaml.cs
回讀的OnLaunched
方法的開頭。然後我將讀取的值與當前的啓動參數進行比較。如果它們是不同的,我只是將null
到rootFrame
變量,從而使一個新的「導航日記」被創建:
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);
}
}
如果應用程序是從次級磁貼啓動的,則可以清除後退堆棧。
接下來按返回按鈕將使用戶回到開始屏幕。
編輯:
要清除後退堆棧:
如果在後面的頁面代碼的時候,做
Frame.BackStack.Clear();
做別的
var frame = Window.Current.Content as Frame;
frame.BackStack.Clear();
- 1. Rails的返回從輔助模塊
- 2. 處理返回按鈕
- 3. 返回按鈕時返回按鈕
- 4. NativeScript處理返回按鈕事件
- 5. 處理返回按鈕去HomeFragment?
- 6. Android片段處理返回按鈕
- 7. 在Android上處理返回按鈕
- 8. 獲取返回按鈕去啓動器
- 9. 按下輔助按鈕時關閉按鈕上的活動狀態
- 10. 當返回按鈕關閉活動時返回意圖結果
- 11. 單擊輔助按鈕時關閉活動div
- 12. 瘦視圖中的()輔助處理時引發ArgumentError
- 13. 處理多個活動的返回按鈕
- 14. 如何處理長按媒體按鈕,以啓動活動?
- 15. 如何從其他活動返回數據,僅返回按鈕從已啓用活動返回的方式
- 16. 從輔助線程啓動NSTimer時出現的問題
- 17. ngClick在mdListItem和輔助按鈕
- 18. 自我禁用按鈕,輔助功能
- 19. 從許多其他地方調用的動作,如何處理「返回」按鈕?
- 20. 按鈕返回=動作按鈕主頁
- 21. 從`using`塊的方法返回時如何處理內存?
- 22. 當我們從Fragment類調用Facebook或Twitter時如何處理返回按鈕?
- 23. 提取通知待處理的輔助
- 24. X86處理器中的輔助標誌
- 25. 處理按鈕動作
- 26. 返回SQL輔助轉換率
- 27. 設計輔助方法(current_user)返回零
- 28. 瓶輔助類和返回值
- 29. rails3輔助方法返回大小
- 30. 自助旅遊啓動按鈕
如何清除WP 8.1後退堆棧? – gabspeck
@gabspeck我爲此添加了代碼。 –
我應該在哪裏放置這段代碼,以便只有當頁面從輔助磁貼導航到頁面時才清除堆棧?我試圖把它放在我測試App.xaml.cs中參數的地方,但它不起作用... – gabspeck