2011-05-23 101 views
3

從墓碑中恢復時,是否有一種很好/優雅的方式可以回到用戶所在的頁面?我不確定我的應用程序或其應用程序的工作方式,但我總是回到主頁面。WP7從墓碑中恢復並返回頁面

我的應用程序設置了一個主頁面,該主頁面有一個數據透視控件,幾個數據透視項目將導航到新頁面。我Naigation看起來是這樣的,如果它是有道理的:

PivotItem1 - >網頁A
PivotItem2 - >網頁B - > PageC
PivotItem3 - >分頁 - > PAGEE - PageF(按後退按鈕PageF將使用非線性導航服務返回主頁)

因此,如果用戶在任何頁面上的墓碑我想返回到該頁面,並有BackStack可用,所以導航不會搞砸。

我正在使用MVVM Light和NonLinear導航服務,如果這有助於或傷害我想要完成的。

+0

只是一個簡短的說明,但也許這可以幫助嗎?我還沒有嘗試過,但它看起來很有希望。 http://tombstonehelper.codeplex.com/ – 2011-05-24 14:12:26

回答

0

我有一個類似的導航沉重的應用程序在那裏,它做你想做的(也使用非線性導航服務)。在我的情況下,我將用戶的當前頁面/數據透視表項存儲在獨立存儲中,以及用於指示應用是否從墓碑歸來的令牌(或布爾)。當用戶導航到頁面時,頁面加載將在iso中設置當前頁面值,並且如果頁面具有透視,則還會將當前透視設置爲第一個透視。 pivot_changed事件有代碼將新的當前數據透視更改爲用戶剛更改的數據。

當應用程序處於邏輯刪除過程中時,會觸發app_deactivate事件,並且在此處將isTombstoned值設置爲iso。

當用戶從邏輯刪除返回時,主page_load首先檢查應用是否從邏輯刪除(IsTombstoned = true)重新激活,如果是,則立即導航到名稱存儲在iso中的頁面。當現在當前的page_load觸發時,它檢查IsTombstoned是否爲true,如果是,則將其設置爲false(恢復正常),並且如果頁面上存在透視,則將選定的透視項目設置爲存儲的當前透視。如果頁面沒有透視控件,則當前的透視爲空白。如果頁面中存在動態內容時,您還需要提供其恢復。

對不起,我沒有顯示你的代碼,但遠離工作站,我無法到達它。

+0

我曾經想過要做這樣的事情,但是由於我在導航中深入了一個PhotoChooserTask,所以我最初描述的內容變得更加棘手。PhotoChooserTask也會導致應用程序Tombstone(應用程序停用/激活),但奇怪的是它能夠返回正確的頁面並且有導航歷史記錄。 – Tyler 2011-05-23 23:28:19

+0

我不認爲停用是非常相同的類型。我有其他的應用程序沒有墓碑處理程序,可以從市場調用中正確地返回,例如,這是一個任務調用。我懷疑像我描述的邏輯處理程序不會被你的PhotoChooserTask絆倒,反之亦然。嗯。 – Cyberherbalist 2011-05-23 23:39:48

+0

Application_Activated和Application_Deactivated觸發常規墓碑和PhotoChooserTask,我沒有看到任何有用的DeactivatedEventArgs來區分這兩個 – Tyler 2011-05-24 00:40:44

1

@Tyler,Cyber​​herbalist:我很遺憾,我不能只是在那裏爲你的討論添加評論。我對聲望或其他方面的評價過低。我沒有任何博客發佈它,並給你一個鏈接。我只是寫在這裏,因爲我認爲這是值得注意和寫作的地方,所以其他人也可以從中檢查/使用/表達利益。

..所以,請原諒我這個「offtopic文章」在這裏:)

雖然我不知道如何很好地解決這個問題 - 我的解決方案通常是收集通過手工導航歷史堆棧,把它變成iso,並在激活時恢復並跳到右側/最後一個地方 - 我可以告訴你一些關於墓碑的信息。

的事情是,如果你的應用是停用,但這並不意味着它墓碑。取消激活只是意味着你的應用程序被換出了屏幕。在芒果版本中,您可以點擊&按住「返回」設備按鈕,查看當前打開了哪些應用程序,然後跳轉到任何應用程序。 「激活」是當你的應用程序被喚醒時。即使在WP7 SDK +模擬器的早期版本中,我也從我的應用程序中調用了外部媒體播放器,而且我的應用程序幾乎從未被實際中斷。取消激活/激活總是恢復我的應用程序就在那裏'停止'。所有內存中的對象都未改動。

當設備資源不足時會發生邏輯異常,並且必須「終止」某些後臺任務以釋放內存。我相信當設備的屏幕保護程序下降並且設備長時間處於待機狀態時也可能會發生這種情況。墓碑將逐字殺死您的應用程序,所有內存中的對象將被銷燬/刪除等。唯一能夠倖存的是AppSettings和ISO商店。墓碑保證發生只有如果您的申請是在停用狀態。

那麼,你可以看到什麼樣的生命週期?

1) 「凍結/待機/無焦點」:

  • 啓動
  • ...(工作)
  • 停用(移動到背景)
  • ...(保存在內存中,也許進程/線程被凍結,但我懷疑)
  • (...)
  • 激活(移動到前臺,沒有導航時)
  • ...(工作)
  • 關閉

2) 「墓碑」:

  • 啓動
  • ...(工作)
  • 停用(移動到背景)
  • ...(保存在內存中,也許進程/線程被凍結,但我懷疑)
  • ...(墓碑,從中刪除內存,一切都毀)
  • (...)
  • ...(潔淨應用對象構造)
  • 激活(移動到前臺)
  • 導航中(我想,總是第一,默認頁面設置在清單中,但我不能肯定現在)
  • (工作)
  • 關閉

這意味着,墓碑可能是有點防不勝防,同時也意味着,你總是甲肝一段時間來嘗試在停用事件處理程序中使您的狀態保持一致。

這也意味着,(除非有一些通知服務,我還不知道),唯一的方法來檢測是否從墓碑恢復是依靠...是依靠最致命/不愉快的影響:清除你的記憶。

想象一下最簡單的情況:你的App對象有一個屬性「private bool _tomb_test」。它可以是任何類型的任何屬性/字段。你也可以使用你的「object ViewModel {get; set}」。

要記住的第一件事是,設置它在構造函數中,並做分配直列默認值。只是讓它漂浮。編譯器/運行時會將應用程序對象創建爲新的時將其設置爲默認值false。這就是要點!

現在:

  • 在推出(不構造函數!!!),設置 「_tomb_test =真」 在停用
  • ,您的最低持續性狀態保存到ISO
  • 在激活後,請檢查:
    • if _tomb_test == false表示您是墓碑式的。你的記憶是乾淨的,所有的物體都被毀壞了。根據最後寫入ISO的數據恢復你的狀態,然後開始所有的工作來重新填充/重新下載/重新加載/重新計算/等應用程序狀態的所有其他部分
    • 但是,如果_tomb_test == true,那意味着墓碑沒有發生。你的記憶力未變。也許只是GC踢了進來並收集了死者。所有活着的物體都還活着。該應用程序可以免費運行,就像沒有任何事情發生過一樣。

雖然它可能看起來很好,請原諒我這個漫長免責聲明:

我在用100%的成功當前應用程序已成功使用它,但我不能說這是保證平臺的行爲。我還沒有時間在MSDN上挖掘事實。以上所有內容都來自我對7.0和7.1 SDK版本的觀察。

上述方法的一個小問題是它在上依賴於(未經證實的)假設,即內存清除以全有或全無方式工作。

也就是說,假設要麼清除所有對象,要麼不清除(當前事實:應用程序對象並且被觀察爲從頭開始重新創建,甚至初始導航發生以重新創建UI。案件都沒有發生)。

對於假設是錯的......我無法想象誰和爲什麼會決定在.net世界中實現部分內存清除。全面清除意味着殺死應用程序。部分清除意味着摧毀GC世代中的隨機生物,並讓所有其他生物隨着搖晃的手柄或無柄手柄而活着。我無法想象它。我沒有觀察到它。因此,我認爲它是全有或全無。

順便說一句。如果您觀察到部分清除並找到一種大致確定的方式來引起它,那麼其他人也可能會看到它,請大聲播放! :)