#setlinebreak(on);
[[WP TIPS に戻る>wp7/tips]]
*Image コントロールで画像ダウンロード失敗したときの画像を表示する [#u8cb4a83]
*Image コントロールなどを巡る Tips [#r76f0502]
**Image コントロールで画像ダウンロード失敗したときの画像を表示する [#u8cb4a83]
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 が発生しない場合 [#a00d5019]
**Image.ImageOpended が発生しない場合 [#a00d5019]
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;
}