Переход на другую страницу из метода ContinueFileOpenPicker

Я использую FilePicker для универсальных приложений Windows и пытаюсь запустить средство выбора файлов из MainPage.xaml, а затем перейти на другую страницу (LoadPhoto.xaml) для отображения выбранного изображения.

Сначала я реализовал свое приложение так, чтобы переходить к LoadPhoto.xaml, а затем, как часть загрузки страницы, я вызывал средство выбора файлов. Однако это вызвало проблемы при возобновлении работы приложения, поэтому я переместил вызов средства выбора файлов из конструктора.

В новейшей реализации я вызываю средство выбора файлов из MainPage.xaml, а затем, если была выбрана фотография, перехожу к LoadPhoto.xaml. Однако, похоже, где-то возникает состояние гонки: иногда приложение остается на главной странице после выбора изображения (похоже, что оно на самом деле переходит на страницу LoadPhoto, но что-то заставляет фрейм вернуться на главную страницу). В других случаях приложение успешно переходит на страницу 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? Полный код с репродукцией находится здесь.


person irodrisa    schedule 12.09.2014    source источник


Ответы (1)


Когда вы вызываете Frame.Navigate для перехода на страницу LoadPhoto, вы передаете сложный объект в качестве параметра: файл, выбранный пользователем. Когда вы возвращаетесь к MainPage и начинаете новый сеанс средства выбора, ваше приложение приостанавливается, а SuspensionManager сериализует состояние фрейма (см. метод SaveFrameNavigationState в этом классе). К сожалению, GetNavigationState< Метод /a> в Frame не поддерживает сериализацию сложных объектов, а только простых, таких как строки, целые числа или GUID. Это задокументировано в методе Frame.Navigate в MSDN.

Причина, по которой вы не видите сбоя приложения при отладке в VS, заключается в том, что (по умолчанию) приложение не приостанавливается в этом сценарии, поэтому код, выдающий исключение, никогда не вызывается. Однако без подключенного отладчика ваше приложение приостанавливается, когда вы выходите из него. Чтобы принудительно приостановить работу, используйте раскрывающийся список События жизненного цикла на панели инструментов Расположение отладки после запуска сеанса выбора.

Если вам действительно нужно сохранить/восстановить состояние фрейма, то вам следует избегать передачи StorageFiles при навигации. Вы можете использовать FutureAccessList, передать путь к файлу при навигации и загрузить его в Загрузить фото.

Если вам не нужно (или вы хотите использовать) то, что может предложить SuspensionManager, вы можете избавиться от него и продолжать передавать объект StorageFile. Однако имейте в виду, что если вы сделаете это, ссылка на этот объект будет сохранена в стеке навигации.

person quimbs    schedule 16.09.2014