WP TIPS に戻る

Image コントロールなどを巡る Tips

Image コントロールで画像ダウンロード失敗したときの画像を表示する

Image コントロールでネット上の画像をダウンロードして表示する場合、

this.image.Source = new BitmapImage(new Uri("http://www.msn.com/image.jpg", UriKind.Absolute));

とすれば Image コントロールが指定した Uri の画像を取得して表示してくれます。便利です。

画像がない・ネットにつながってないなどで、画像が取得できなかった場合は ImageFailed イベントが発生しますので、これをつかって、

this.image.Source = new BitmapImage(new Uri("icons/appbar.cancel.rest.png", UriKind.Relative));

とすれば「×」画像を表示することが出来ます。
※「×」画像を開いた時に ImageOpened イベントが発生しますので注意。

Image.ImageOpended が発生しない場合

Image コントロールには、Image.ImageOpened, Image.ImageFailed と言うイベントがあり、画像が開いた、画像を開けなかった、という状態を取得することが出来ます。

image.Source = new Uri("http://www.hoge.com/image.jpg", UriKind.Absolute);

としてネット上からダウンロードする場合にも取得可否が得られるので便利ですね。

Uri uri = new Uri("Images/hi-miho.jpg", UriKind.Relative);

この ImageOpened イベントですが、実は発生しない事があります。
それは BitmapImage をストリームから生成し、それを Image.Source に渡した場合です。
以外と気づかないですが、BitmapImage.SetSource(stream) をした時点で画像が読み込まれているので、Image.ImageOpened/BitmapImage.ImageOpend は発生しません。
当たり前と言えば当たり前なのですが、気づかないではまったことがあります。

private void imagesource_button_Click(object sender, System.EventArgs e)
{
   // ImageOpened イベントが発生する
   BitmapImage bitmap = new BitmapImage(uri);
   bitmap.ImageOpened += new EventHandler<RoutedEventArgs>(bitmap_ImageOpened);
   this.image.Source = bitmap;
}

private void imagestream_button_Click(object sender, System.EventArgs e)
{
   // ImageOpened イベントは発生しない
   // 何故なら bitmap.SetSource した時点で読み込みが完了しているから。
   StreamResourceInfo info = Application.GetResourceStream(uri);
   BitmapImage bitmap = new BitmapImage();
   bitmap.ImageOpened += new EventHandler<RoutedEventArgs>(bitmap_ImageOpened);
   bitmap.SetSource(info.Stream);
   this.image.Source = bitmap;
}

// BitmapImage のイベント
void bitmap_ImageOpened(object sender, RoutedEventArgs e)
{
   MessageBox.Show("Opened bitmap");
   this.image.Source = null;
}

// Image コントロールのイベント
private void image_ImageOpened(object sender, System.Windows.RoutedEventArgs e)
{
   MessageBox.Show("Opened");
   this.image.Source = null;
}