Главная » Разработка для Windows Phone 7 » Image и ImageSource

0

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

Однако более тщательное рассмотрение элемента Image приводит в замешательство. Элемент Image не является растровым изображением, он просто обеспечивает отображение растрового изображения. Во всех примерах ранее в качестве значения свойства Source объекта Image задавался путь к файлу или URL:

<Image Source="Images/Hello.png" />

<Image Source="http://www.charlespetzold.com/Media/HelloWP7.jpg" />

Можно предположить, что это свойство Source типа string. Извините, но вовсе нет! На самом деле здесь представлен синтаксис XAML, скрывающий довольно многое. Свойство Source фактически типа ImageSource (Источник изображения). Это абстрактный класс, от которого

наследуется BitmapSource (Источник растрового изображения). А это еще один абстрактный класс, описывающий метод SetSource (Задать источник), который позволяет загружать растровое изображение из объекта Stream.

От класса BitmapSource наследуется BitmapImage (Растровое изображение), который поддерживает конструктор, принимающий объект Uri и также включающий свойство UriSource (Источник URI) типа Uri. Проект SilverlightTapToDownloadl имитирует приложение, загружающее растровое изображение, URL которого известен только во время выполнения. XAML включает элемент Image без растрового изображения:

Проект Silverlight: SilverlightTapToDownload1 Файл: MainPage.xaml (фрагмент)

<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">

<Image Name="img" /> </Grid>

BitmapImage требует подключения пространства имен System.Windows.Media.Imaging посредством директивы using. Когда MainPage регистрирует касание, он создает BitmapImage из объекта Uri и задает его в качестве значения свойства Source элемента Image:

Проект Silverlight: SilverlightTapToDownload1 Файл: MainPage.xaml.cs (фрагмент)

protected override void OnManipulationStarted(ManipulationStartedEventArgs args) {

Uri uri = new Uri("http://www.charlespetzold.com/Media/HelloWP7.jpg"); BitmapImage bmp = new BitmapImage(uri); img.Source = bmp;

args.Complete();

args.Handled = true;

base.OnManipulationStarted(args);

}

Не забудьте коснуться экрана, чтобы начать загрузку!

Класс BitmapImage описывает события ImageOpened и ImageFailed (которые дублируются элементом Image) и также включает событие DownloadProgess (Процесс загрузки).

Если есть желание, WebClient можно явно использовать в приложении на Silverlight, как показано в следующем проекте. Файл SilverlightTapToDownload2.xaml аналогичен SilverlightTapToDownload1.xaml. Файл выделенного кода использует WebClient практически так же, как это было в предыдущем приложении на XNA:

Проект Silverlight: SilverlightTapToDownload2 Файл: MainPage.xaml.cs (фрагмент)

protected override void OnManipulationStarted(ManipulationStartedEventArgs args) {

WebClient webClient = new WebClient();

webClient.OpenReadCompleted += OnWebClientOpenReadCompleted; webClient.OpenReadAsync(new Uri("http://www.charlespetzold.com/Media/HelloWP7.jpg"));

args.Complete();

args.Handled = true;

base.OnManipulationStarted(args);

}

void OnWebClientOpenReadCompleted(object sender, OpenReadCompletedEventArgs args)

{

if (!args.Cancelled && args.Error == null) {

BitmapImage bmp = new BitmapImage(); bmp.SetSource(args.Result); img.Source = bmp;

}

}

Обратите внимание на использование SetSource для создания растрового изображения из объекта Stream.

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

По теме:

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