2017-06-01 63 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