2017-06-01 59 views
0

我有一个控件,包含应该从文件位置(网络或本地)拉出的图像。我有以下XAML代码:WPF图像后备不起作用失败的网络图像

 <Image Width="96" Height="96" Stretch="Uniform" Grid.Column="1" 
       Source="{Binding PreviewImageFullPath, FallbackValue={StaticResource img_Fallback}, TargetNullValue={StaticResource img_Fallback}}" /> 

,这是它指的是img_Fallback:

<BitmapImage UriSource="pack://application:,,,/GamutBase;component/Images/Icon_PreviewMissing.png" x:Key="img_Fallback" /> 

当相关属性为空或空字符串,它显示了就好了。如预期的那样,如果该属性被设置并且该文件存在,则主图像显示出来。但是,如果将该属性设置为未找到的位置,则根本不显示任何位置,主图像(显然)或后备。在这种情况下,你如何制作备用秀?

+0

注意FallBackValue是结合自身的属性。这意味着,当绑定失败时,将使用FallBackValue。但绑定本身并不会失败,对吧? 'Image'有一个[ImageFailed](https://msdn.microsoft.com/en-us/library/system.windows.controls.image.imagefailed(v = vs.110).aspx)事件,您可以使用它检测从网络上加载图像失败... – elgonzo

+0

ImageFailed事件工作完美,我只是告诉它在图像上返回一个null失败并触发一个属性更改事件,更新就像我希望的一样!如果你让它成为答案,我会接受。 – sfaust

+0

您也可以实现显式读取图像文件或发出http请求的绑定转换器,并在原始无法加载的情况下返回后备图像。 – Clemens

回答

1

这可能是矫枉过正 - 但你可以用Behaviour来解决这个问题。

XAML

xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" 
    xmlns:myBehaviour="clr-namespace:MyWpfApp.Behaviours" 

如果你没有找到http://schemas.microsoft.com/expression/2010/interactivity命名空间 - 从Assemblys在Visual Studio中添加。

<Image Width="96" 
      Height="96" 
      Stretch="Uniform" 
      Grid.Column="1" 
      Source="{Binding PreviewImageFullPath}"> 
     <i:Interaction.Behaviors> 
      <myBehaviour:WebImageFallBackBehaviour FallBackImageSource="{StaticResource img_Fallback}" /> 
     </i:Interaction.Behaviors> 
    </Image> 

C#

public class WebImageFallBackBehaviour : System.Windows.Interactivity.Behavior<Image> 
    { 


     public string FallBackImageSource 
     { 
      get { return (string)GetValue(FallBackImageSourceProperty); } 
      set { SetValue(FallBackImageSourceProperty, value); } 
     } 

     // Using a DependencyProperty as the backing store for FallBackImageSource. This enables animation, styling, binding, etc... 
     public static readonly DependencyProperty FallBackImageSourceProperty = 
      DependencyProperty.Register("FallBackImageSource", typeof(string), typeof(WebImageFallBackBehaviour), new PropertyMetadata(string.Empty)); 



     protected override void OnAttached() 
     { 
      base.OnAttached(); 
      this.AssociatedObject.ImageFailed += AssociatedObject_ImageFailed; 
     } 

     protected override void OnDetaching() 
     { 
      base.OnDetaching(); 
      this.AssociatedObject.ImageFailed -= AssociatedObject_ImageFailed; 
     } 

     private void AssociatedObject_ImageFailed(object sender, System.Windows.ExceptionRoutedEventArgs e) 
     { 
      Image self = sender as Image; 

      if(self != null) 
      { 
       self.Source = new BitmapImage(new Uri(FallBackImageSource, UriKind.Relative)); 
      } 
     } 
    } 

附加信息

如何设置SourceImage programmaticly。

+0

哇,这是相当多的代码,谢谢!我正在处理图像失败事件在这种情况下,但upvoting在这方面的努力... – sfaust

+0

以防万一你想要没有代码 – Peter