Pull to refresh

Создание приложения для Windows Phone 7 от начала до конца. Часть 15. Доступ к фотографиям на Windows Phone

Development for Windows Phone *
Translation
Original author: Microsoft Developer Guidance team
Предыдущая часть

Вы можете использовать фотографии и другие изображения в виде ресурсов приложения для их отображения в пользовательском интерфейсе. Ваше приложение может обратиться к фотографиям в медиа-библиотеке телефона или позволить пользователям делать снимки с помощью встроенной камеры.

В этой части вы узнаете:
  • Как получить доступ к фотографиям на Windows Phone.

Доступ к фотографиям на Windows Phone


Для того, чтобы получить доступ к изображениям из медиа-библиотеки и снимкам с камеры, используйте PhotoChooserTask и CameraCaptureTask. Эти классы известны как choosers (choose — выбирать), потому что они открывают отдельное окно, в котором пользователь и осуществляет выбор, который затем возвращается вашему приложению. Также существуют launchers (launch — запускать), которые открывают отдельное окно, но при этом не возвращают выбор пользователя приложению.

PhotoChooserTask и CameraCaptureTask требуют похожий код, так что мы опишем только PhotoChooserTask. Кроме того, будет описано, как сохранить выбранные фотографии в изолированном хранилище. Вы также можете получать и сохранять изображения в медиа-библиотеку через класса XNA MediaLibrary. Однако, этот класс не будет рассматриваться.

Чтобы использовать chooser, вам необходимо создать его экземпляр. На следующем изображении показан пример PhotoChooserTask.

image

После того, как пользователь осуществил выбор, вы должны обработать событие Completed, чтобы выполнить соответствующие действия. Следующий фрагмент кода (из CarDetailsPage.xaml.cs) демонстрирует, как создать PhotoChooserTask и обработать его событие Completed. Обратите внимание, что PhotoChooserTask должен являться глобальной переменной для страницы, а событие Completed должно быть подключено в конструкторе.
  1. private readonly PhotoChooserTask photoTask = new PhotoChooserTask();
  2.  
  3. public CarDetailsPage()
  4. {
  5.     InitializeComponent();
  6.     photoTask.Completed += PhotoTask_Completed;
  7.  
  8.     // ... other code ...
  9. }
  10.  
  11. private void PhotoButton_Click(object sender, RoutedEventArgs e)
  12. {
  13.     photoTask.Show();
  14. }
  15.  
  16. private void PhotoTask_Completed(object sender, PhotoResult e)
  17. {
  18.     if (e.TaskResult == TaskResult.OK)
  19.     {
  20.         var image = new System.Windows.Media.Imaging.BitmapImage();
  21.         image.SetSource(e.ChosenPhoto);
  22.         CarDataStore.SaveTempCarPhoto(image, delegate
  23.         {
  24.             MessageBox.Show("There is not enough space on " +
  25.                 "your phone to save your selection. Free some " +
  26.                 "space and try again.", "Warning", MessageBoxButton.OK);
  27.         });
  28.         car.Picture = image;
  29.         hasUnsavedChanges = true;
  30.     }
  31. }
* This source code was highlighted with Source Code Highlighter.

После того, как пользователь нажимает кнопку «Photo», отображается PhotoChooserTask. Это вызывает дезактивацию приложения. После того, как пользователь выбрал фото, приложение повторно активируется, хотя в данном случае, событие PhotoChooserTask.Completed происходит до того, как метод OnNavigatedTo вызывается для обработки повторной активации.

Обработчик события Completed создает новый BitmapImage и устанавливает в качестве его источника (source) выбранную фотографию. Далее, обработчик события помещает изображение в изолированное хранилище. Изображения не сериализуемы, поэтому они не могут быть сохранены в хранящиеся в памяти словари состояний, ни в словари состояний изолированного хранилища. Поэтому, если вы хотите сохранить изображение, вы должны сохранить его с помощью виртуального интерфейса файловой системы изолированного хранилища (isolated storage virtual file system interface). Класс CarDataStore должен также поместить фото в изолированное хранилище после того, как пользователь нажмёт кнопку «Save». Таким образом методы SaveTempCarPhoto и GetTempCarPhoto для того, чтобы обработать временное фото, просто оборачивают (wrap) методы SaveCarPhoto и GetCarPhoto, используемые для обработки сохраненной фотографии. Описание методов SaveCarPhoto и GetCarPhoto приводилось в части «Изолированное хранилище: сохранение и загрузка данных».

И в конце обработчик события назначает изображение свойству Picture объекта Car, хранящегося в поле car. После этого фото появится в элементе управления Image, связанном со свойством Picture.

Примечание:
Класс PhotoResult, переданный обработчику события Completed, содержит свойство OriginalFileName. Это свойство было бы удобно использовать для получения выбранной фотографии из XNA MediaLibrary так, чтобы вы не должны были сохранять его отдельно в изолированном хранилище. Однако, на момент написания статьи реализация OriginalFileName ведёт себя не так, как ожидалось: оно возвращает временное имя файла, что не является полезным для получения фото из класса XNA MediaLibrary позже. Однако, даже если вы могли бы использовать медиа-библиотеку таким образом, вы, скорее всего, по-прежнему предпочли бы хранить выбранные пользователем изображения в изолированном хранилище. В таком случае они останутся доступными для вашего приложения, даже если пользователь удалит позже изображения из медиа-библиотеки или изменит их содержание с помощью других приложений.
Tags:
Hubs:
Total votes 34: ↑19 and ↓15 +4
Views 1.4K
Comments Leave a comment