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