0

我将 Windows Phone 8.1(RT 不是 silverlight)上 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;
}

如果你不喜欢这样,那么你可以有两个图像。一个在另一个之上,并根据失败设置其可见性。像这样的伪代码:

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 回答