#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;
 }