0

我正在使用适用于 Windows 通用应用程序的 FilePicker,我正在尝试从 MainPage.xaml 启动文件选择器,然后导航到不同的页面 (LoadPhoto.xaml) 以呈现所选图像。

我最初实现了我的应用程序,以便导航到 LoadPhoto.xaml,然后,作为加载页面的一部分,我将调用文件选择器。但是,在恢复应用程序时会导致问题,因此我将 File Picker 调用移出构造函数。

在最新的实现中,我从 MainPage.xaml 调用文件选择器,然后,如果选择了一张照片,则导航到 LoadPhoto.xaml。但是,某处似乎存在竞争条件:有时,应用程序在选择图片后停留在 MainPage 上(看起来它实际上是在导航到 LoadPhoto 页面,但某些东西使 Frame 回到了 MainPage)。其他时候,应用程序成功导航到 LoadPhoto 页面并呈现图像,但如果我使用返回按钮导航回来,然后再次按下 Pick photo 按钮,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 的完整代码在这里

4

1 回答 1

0

当您调用 Frame.Navigate 以转到 LoadPhoto 页面时,您将一个复杂对象作为参数传递:用户选择的文件。当您返回 MainPage 并开始一个新的选择器会话时,您的应用程序将暂停,并且 SuspensionManager 序列化框架的状态(请参阅该类中的 SaveFrameNavigationState 方法)。不幸的是,Frame 中的GetNavigationState方法不支持序列化复杂对象,而仅支持简单对象,如字符串、整数或 guid。这在 MSDN 上的 Frame.Navigate 方法中有记录。

在 VS 中调试时看不到应用程序崩溃的原因是(默认情况下)应用程序在这种情况下不会暂停,因此永远不会调用引发异常的代码。但是,在没有附加调试器的情况下,当您离开它时,您的应用程序会暂停。要强制暂停,请在启动选择器会话后使用“调试位置”工具栏中的“生命周期事件”下拉菜单。

如果您确实需要保存/恢复框架的状态,那么您应该避免在导航时传递 StorageFiles。您可以使用FutureAccessList,在导航时将路径传递给文件并将其加载到 LoadPhoto 中。

如果您不需要(或不想使用) SuspensionManager 必须提供的功能,那么您可以摆脱它并继续传递 StorageFile 对象。但是,请记住,如果您这样做,对该对象的引用将保留在导航堆栈中。

于 2014-09-16T04:59:54.880 回答