0

Windows Phone 8.1 (Silverlight ではなく RT) の ImageBrush の ImageSource をリモート uri にバインドし、画像が既定の画像を表示できない場合にハンドラーを用意しています。

<ImageBrush Stretch="UniformToFill" ImageSource="{Binding MyBackgroundUrl}" ImageFailed="ImageBrush_ImageFailed"/>

コード ビハインドでは、イメージ ソース プロパティを更新してローカル イメージに設定します。

    protected void ImageBrush_ImageFailed(object sender, ExceptionRoutedEventArgs e)
    {
            var img = sender as ImageBrush;
            if (img == null) return;

            var uri = new BitmapImage(new Uri("ms-appx:///Assets/App/MyDefaultBackground.jpg"));
            img.ImageSource = uri;
    }

これはうまく機能しますが、これを行うと元のバインディングが失われるため、同じ画面を異なるバインディング値でリロードすると、再バインドされません。

これは私がしていることを考えると理にかなっています。その場合、私の質問は、何が間違っていたのか、リロード時にイメージが再バインドできるようにしながらフォールバックイメージを正しくセットアップするにはどうすればよいですか?

4

1 に答える 1

1

もちろんそうですね。バインディングを上書きしています。次のようにプロパティを設定する必要があります。

void ImageBrush_ImageFailed(object sender, ExceptionRoutedEventArgs e)
{
    var img = sender as ImageBrush;
    if (img == null) return;

    var uri = new BitmapImage(new Uri("ms-appx:///Assets/App/MyDefaultBackground.jpg"));
    var vm = img.DataContext as MainPageViewModel;
    vm.MyBackgroundUrl = uri;
}

それが気に入らない場合は、2 つの画像を使用できます。1 つずつ重ねて、失敗に基づいて可視性を設定します。この擬似コードのようなもの:

var img = new Image();
// you would not new it up here, you would ref your control.
img.ImageOpened += (s, e) => OverlayImage.Visibility = Visibility.Collapsed;
img.ImageFailed += (s, e) => OverlayImage.Visibility = Visibility.Collapsed;

あなたにとって意味がありますか?

画像ではなく、画像ブラシについて話していることに気付きました。ロジックは同じはずですが、オーバーレイの代わりにアンダーレイが必要になる場合があります。また、これはアンダーレイであるため、イメージ ブラシが成功するとアンダーレイが遮られるため、可視性を切り替える必要がない場合があります。あなたの場合はさらに簡単かもしれません。

頑張ってください!

于 2016-02-09T06:11:20.840 に答える