2014-09-12 2 views
0

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

Первоначально я реализовал свое приложение, чтобы перейти к LoadPhoto.xaml, а затем, как часть загрузки страницы, я бы назвал File Picker. Однако это вызвало проблемы при возобновлении приложения, поэтому я переместил вызов 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? Полный код с воспроизведением - here.

ответ

0

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

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

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

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

+0

Большое спасибо @quimbs! Это работало как шарм. :) – irodrisa

Смежные вопросы