2017-04-15 219 views
2

我有多個頁面的應用程序,與navigateto邏輯連接。UWP頁面生命週期

其中一個頁面包含具有網絡攝像機綁定的媒體元素。進入後臺模式(例如,通過最小化應用程序思考點擊系統​​菜單)後,攝像機元素停止。因此,我訂閱了
Windows.ApplicationModel.Core.CoreApplication.LeavingBackground事件並重新初始化相機。如果當前頁面是具有此訂閱和相機元素的頁面,則一切正常。如果當前頁面是另一個頁面,並且應用程序已恢復,則無論如何都會發生LeavingBackground此事件,因此隱藏頁面會嘗試重新初始化攝像機。

我試圖設置this.NavigationCacheMode = NavigationCacheMode.Disabled,因此包含媒體元素和訂閱LeavingBackground事件的頁面實例在理論上必須根據MSDN在NavigatedTo事件之後進行處理。但是,這是我不瞭解的另一種方式。

看來,相機頁面實例化一次,永遠,並將永遠收到LeavingBackgound事件 - 這對我來說很糟糕。

我試圖比較Window.Current.Content.GetType()與包含相機元素的頁面類型,但有時這種類型包含另一個頁面的類型,但有時它與Content.Content一起移動,所以我卡住了。

回答

3

我會假設你必須註銷從頁面導航離開時,事件處理程序:您需要處理掛起

public sealed partial class WebCamPage 
{ 
    public WebCamPage() 
    { 
     InitializeComponent(); 
    } 

    protected override void OnNavigatedTo(NavigationEventArgs e) 
    { 
     Windows.ApplicationModel.Core.CoreApplication.LeavingBackground += OnLeavingBackground; 
    } 

    protected override void OnNavigatingFrom(NavigatingCancelEventArgs e) 
    { 
     Windows.ApplicationModel.Core.CoreApplication.LeavingBackground -= OnLeavingBackground; 
    } 

    private void OnLeavingBackground(object sender, LeavingBackgroundEventArgs e) 
    { 
     // Your code here. 
    } 
} 
+0

這是我嘗試過的解決方法之一,但我認爲這不是優雅和正確的。我仍然不明白爲什麼頁面不處理。 –

+2

只要訂閱靜態事件(如LeavingBackground),您的頁面就不會被處置,因爲該靜態事件處理程序會在其上保留一個活動引用。你可以通過使用內存診斷工具來查看。 –

+0

這不是我的頁面。這是你的設計,而不是優雅,真正的過於複雜。但我相信,你沒有努力改變這一點。 –

1

和恢復活動,以清理和重新正確初始化相機一樣,它顯示在照相機樣本應用程序:

https://github.com/Microsoft/Windows-universal-samples/blob/master/Samples/CameraStarterKit/cs/MainPage.xaml.cs

感謝, 斯特凡威克 - Windows 8開發平臺

+0

這些事件對我而言毫無用處。試着理解我的問題。 –

+1

掛起/恢復是進入/離開背景時觸發的事件 - 在其他情況下,系統暫停或恢復您的應用程序。看看相機樣品。 –

+0

好的,會嘗試。 –