2016-03-06 166 views
0

我正在開發一個使用Microsoft樂隊的UWP模板10(漢堡)應用程序,我認爲我已經完成了很多工作,因爲我已將所有服務綁定到樂隊(通過類庫項目),並在屏幕上完美更新值。 然後我開始測試應用程序的簡歷,並遇到了一個問題。 當我重新啓動一個應用程序時,用戶將被帶回值頁面,但值不再更新。 基本上與樂隊的連接似乎仍然有效,但readchanged空洞不再有效。Template10在應用程序暫停後繼續運行服務

所以我在MainPageViewModel的OnNavigatedFromAsync方法中添加了代碼來停止所有的服務沒有問題。 但後來我發現,當恢復OnNavigatedToAsync方法不會被解僱,所以我不能解決如何重新啓動所有的服務。

我也嘗試在app.xaml.cs中添加OnResuming和OnSuspendingAsync的覆蓋,但是隨後無法解決如何從MainPageViewModel調用方法。 有沒有正確的方法來處理這樣的事情使用Template10?

回答

1

我假設您在Visual Studio中使用Simulation Dashboard控件來暫停然後恢復您的應用程序。那麼,請不要使用簡歷按鈕。它沒有按預期工作。要測試應用程序的恢復,請使用暫停按鈕,然後從樂隊的界面中打開它(而不是使用恢復按鈕)。 OnNavigatedToAsync方法應該很好地觸發。

更新: 根據以下回答的討論,我提供了關於以下幾行的更新答案。

設置靜態視圖模型屬性在App類,像這樣:

public static TypeOfMyViewModel MyViewModel; 

然後,在TypeOfMyViewModel構造函數中添加以下行來設置值屬性:

public TypeOfMyViewModel() 
{ 
    App.MyViewModel = this; 
} 

最後,在OnResuming方法中,只需調用ViewModel中的一個方法,該方法將恢復您的服務,如下所示:

public override void OnResuming(object s, object e, AppExecutionState previousExecutionState) 
{ 
    MyViewModel.ResumeServices(); 
} 
+0

好吧有趣,我一直在使用簡歷選項是。正如你所說,使用生命週期中的簡歷事件不會調用OnNavigatedToAsync。然而,它仍然沒有像預期的那樣工作。如果我暫停應用程序,然後從開始菜單重新啓動它,然後我可以捕獲OnNavigated到異步並重新啓動一切,然後我的值再次開始更新,很棒:)但是,如果我嘗試並通過使用任務列表恢復(長期保留在後面箭頭)事件仍然不會啓動並且服務不再啓動.. – BGTurner

+0

啊,對不起,你是對的,它不會啓動。不過,我認爲當應用程序暫停時,您不應該停止您的服務。根據[開發人員指南到Windows 10](https://mva.microsoft.com/en-US/training-courses/a-developers-guide-to-windows-10-12618),應用程序生命週期,Windows將會爲你做那個。在你回到應用程序後,你的代碼應該恢復。所有異步調用在暫停之前開始將返回一個錯誤。有關詳細信息,請參閱約12分鐘的視頻。 –

+0

是的,我並不期望必須停止所有的服務,這就是我最終試圖讓所有事情一旦恢復運行的地方。對於樂隊來說,沒有任何異步呼叫是我不認爲的。你啓動一個異步命令來啓動它們,例如'await _bandClient.SensorManager.RRInterval.StartReadingsAsync();'然後你只是聽帶子上升事件'_bandOperator.EventRRIntervalChanged + = _bandOperator_EventRRIntervalChanged;'在恢復這些事件之後,如果不再調用第一段代碼,就不會再發生。 – BGTurner

1

當您通過Windows平臺或通過Visual Studio暫停和恢復應用程序時,恢復操作超快,因爲它只是一個內存交換。在這種情況下,您的應用程序通常不會知道您的應用程序已被暫停。此操作的一個示例可能是您的用戶接到電話,然後返回到您的應用程序。使用模板10,您的視圖模型INav方法肯定不會被調用,因爲您的應用程序的狀態沒有改變。如果您必須知道它已被暫停並正在恢復,那麼您可以在應用程序的Application/Bootstrapper中點擊OnResuming覆蓋。取決於你需要完成什麼,你可能需要通過一個全局靜態事件公開這個操作,這樣你的視圖模型可以以某種方式處理它。

在Visual Studio中使用調試位置,然後您可以Suspend and Shutdown這也將暫停您的應用程序,但會將其恢復狀態從PreviousExecutionState =運行到終止。在這種情況下,你的應用當然不會記憶,當然也不會處於相同的狀態。它正在重新啓動,並且在此過渡期間模板10會啓動以恢復您的導航狀態,設置以及其他一切。它也會調用你的視圖模型的INAV覆蓋像NavTo和NavFrom。

但要小心。引導程序的OnResuming也將在此操作期間調用。對你來說幸運的是,之前的狀態被傳遞給這個覆蓋,你可以在你的調用代碼中無縫處理這個獨特的情況。

有意義嗎?

祝你好運。

+0

是的,我認爲我主要是通過廣泛的調試和映射整個過程來了解它是如何工作的,我只是在實際執行該部分時遇到問題:_如果您必須知道它已被暫停並正在恢復,那麼您可以在應用程序的Application/Bootstrapper中點擊OnResuming覆蓋。取決於你需要完成什麼,你可能需要通過一個全局靜態事件來公開這個操作,這樣你的視圖模型可以以某種方式處理它._除了web開發之外,任何事情都很綠色,這是我第一次真正嘗試一個應用程序,windows 10,並且樂隊一起學習很多東西..:D – BGTurner

相關問題