我将Windows Phone 8.1上的ImageBrush的ImageSource(RT不是silverlight)绑定到远程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;
}
这很有效,但是通过这样做,我将丢失原始绑定,因此如果我使用不同的绑定值重新加载相同的屏幕,它就不会重新绑定。
考虑到我正在做的事情,这是有道理的,所以在这种情况下我的问题是我做错了什么以及如何正确设置回退图像,同时允许图像在重新加载时重新绑定? / p>
答案 0 :(得分: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;
对你有意义吗?
我刚刚注意到你在谈论的是图像画笔,而不是图像。逻辑应该是相同的,但它可能需要是一个底层而不是覆盖。此外,因为它是一个参考底图,您可能不需要切换其可见性,因为成功的图像画笔将遮挡参考底图。在你的情况下可能更容易。
祝你好运!