簡體   English   中英

從ContinueFileOpenPicker方法導航到另一個頁面

[英]Navigate to a different page from ContinueFileOpenPicker method

我正在使用Windows Universal應用程序的FilePicker,並且嘗試從MainPage.xaml啟動文件選擇器,然后導航到其他頁面(LoadPhoto.xaml)以呈現選定的圖像。

最初,我實現了我的應用程序,以便導航至LoadPhoto.xaml,然后,在加載頁面時,我將調用文件選擇器。 但是,這在恢復應用程序時引起了問題,因此我將File Picker調用移出了構造函數。

在最新的實現中,我從MainPage.xaml調用文件選擇器,然后,如果已選擇照片,請導航至LoadPhoto.xaml。 但是,某處似乎存在競爭狀況:有時,應用程序在選擇圖片后仍停留在MainPage上(看起來實際上是在導航至LoadPhoto頁面,但有些東西使Frame返回MainPage)。 其他時候,該應用程序成功導航到LoadPhoto頁面並渲染圖像,但是如果我使用“后退”按鈕向后導航,然后再次按“拾取照片”按鈕,則會短暫顯示FilePicker,然后該應用程序崩潰。 附加了VS后,此行為無法復制。 在“調試”模式下執行時,一切正常。

我認為根本原因是ContinueFileOpenPicker代碼是從工作線程執行的,所以我不應該調用this.Frame.Navigate(typeof(LoadPhoto), file); 從那個線程。 該調用應從主線程進行,但我不確定如何執行。

不幸的是,這不能解決問題: await CoreWindow.GetForCurrentThread().Dispatcher.RunAsync(CoreDispatcherPriority.Norm‌​al, () => { this.Frame.Navigate(typeof(LoadPhoto), file); });

如何從ContinueFileOpenPicker方法導航到其他頁面? 帶有repro的完整代碼在這里

當您調用Frame.Navigate進入LoadPhoto頁面時,您正在傳遞一個復雜的對象作為參數:用戶選擇的文件。 當您返回MainPage並開始一個新的選擇器會話時,您的應用將被掛起,並且SuspensionManager會序列化框架的狀態(請參閱該類中的SaveFrameNavigationState方法)。 不幸的是,Frame中的GetNavigationState方法不支持序列化復雜對象,而僅支持序列,字符串或整數等簡單對象。 在MSDN上的Frame.Navigate方法中對此進行了說明。

在VS中進行調試時,看不到應用程序崩潰的原因是(默認情況下)在這種情況下應用程序不會掛起,因此永遠不會調用引發異常的代碼。 但是,沒有連接調試器,當您離開應用程序時,該應用程序將被掛起。 要強制暫停,啟動選擇器會話后,請使用“ 調試位置”工具欄中的“ 生命周期事件”下拉列表。

如果確實需要保存/恢復框架的狀態,則應避免在導航時傳遞StorageFiles。 您可以使用FutureAccessList ,在導航時將路徑傳遞到文件,並將其加載到LoadPhoto中。

如果您不需要(或不想使用)SuspensionManager提供的功能,則可以擺脫它,並繼續傳遞StorageFile對象。 但是,請記住,如果執行此操作,則對該對象的引用將保留在導航堆棧中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM