Главная » Разработка для Windows Phone 7 » Загрузка хранящихся локально растровых изображений из кода

0

В приложении на Silverlight растровое изображение, добавляемое в проект как ресурс, встраивается в исполняемый файл. Обращаться к локальному растровому изображению напрямую из XAML настолько просто, что лишь очень немногие опытные разработчики на Silverlight смогут без подготовки рассказать, как можно сделать это в коде. А мы рассмотрим для этого проект SilverlightTapToLoad.

Как и остальные приложения на Silverlight в данной главе, проект SilverlightTapToLoad включает сетку для содержимого с элементом Image. Растровое изображение Hello.png хранится в папке Images, и его свойство Build Action имеет значение Resource.

Для использования класса BitmapImage в файле MainPage.xaml.cs должна присутствовать директива using для пространства имен System.Windows.Media.Imaging. Еще одна директива using для System.Windows.Resources требуется для работы с классом StreamResourceInfo (Данные потокового ресурса).

Когда происходит касание экрана, обработчик события выполняет доступ к ресурсу с помощью статического метода GetResourceStream, описанного классом Application:

Проект Silverlight: SilverlightTapToLoad Файл: MainPage.xaml.cs

protected override void OnManipulationStarted(ManipulationStartedEventArgs args) {

Uri uri = new Uri("/SilverlightTapToLoad;component/Images/Hello.png", UriKind.Relative);

StreamResourceInfo resourceInfo = Application.GetResourceStream(uri); BitmapImage bmp = new BitmapImage(); bmp.SetSource(resourceInfo.Stream); img.Source = bmp;

args.Complete();

args.Handled = true;

base.OnManipulationStarted(args);

}

Посмотрите, насколько сложен этот URL! Он начинается с названия приложения, потом следует точка с запятой, потом слово «component», и за ним уже имя папки и файла. Если для файла Hello.png изменить значение Build Action с Resource на Content, синтаксис существенно упроститься:

Uri uri = new Uri("Images/Hello.png", UriKind.Relative);

В чем разница?

В подпапке Bin/Debug проекта Visual Studio можно увидеть файл нашего приложения SilverlightTapToLoad.xap. Если изменить расширение этого файла на ZIP, мы получим возможность заглянуть внутрь. Основным содержимым этого файла будет SilverlightTapToLoad.dll, скомпилированный двоичный файл.

В обоих случаях очевидно, что растровое изображение хранится где-то в файле XAP. Разница в том, что:

•         Когда Build Action растрового изображения задано значение Resource, оно хранится в файле SilverlightTapToLoad.dll вместе со скомпилированным приложением.

•         Когда Build Action растрового изображения задано значение Content, оно хранится вне файла SilverlightTapToLoad.dll, но в файле XAP. Если переименовать XAP-файл в ZIP-файл, в нем можно увидеть папку Images и файл.

Какой из вариантов лучше?

В документе Майкрософт, озаглавленном «Creating High Performance Silverlight Applications for Windows Phone»[4], для Build Action ресурсов приложения рекомендуется задавать значение Content, а не Resource, что позволит сократить размер двоичного файла и время загрузки приложения при запуске. Однако если эти ресурсы располагаются в библиотеке Silverlight, используемой приложением, лучше включить их в двоичный файл, задав для Build Action значение Resource.

Если программа использует большое количество изображений, и нет желания помещать их все в XAP-файл, но есть опасения по поводу загрузки из Интернета, почему бы не скомбинировать оба способа? Включите в XAP-файл изображения с низким разрешением (или высокой степенью сжатия), но версии этих же изображений более высокого качества загружайте асинхронно в процессе выполнения приложения.

Источник: Чарльз Петзольд, Программируем Windows Phone 7, Microsoft Press, © 2011.

По теме:

  • Комментарии