2015-03-31 26 views
0

我有XAML这样的BitmapImage抛出一个异常初始化时,文件不存在

<Image x:Name="MyImage"> 
    <Image.Source> 
     <BitmapImage UriSource="{Binding FullPhotoPath}" CacheOption="OnLoad" /> 
    </Image.Source> 
</Image> 

这工作得很好,只要FullPhotoPath存在。如果没有,则会抛出异常

'System.Windows.Media.Imaging.BitmapImage'的初始化引发异常。

我知道我可以只使用图片标签

要显示的图像,如果不存在,那么它是没有任何显示(没有抛出异常),但据我可以告诉这个语法不允许我使用CacheOption

我怎么能证明什么,如果图片的路径不存在?

+0

你在代码隐藏文件试图处理异常? XAML不支持此功能 – uowzd01 2015-04-01 01:17:34

回答

1

你可以使用一个转换器与任何你需要的设置,这也可以只返回null,如果你看到的文件不存在,然后只绑定通过转换器的Image.Source创建的BitmapImage。

public class PathToBitmapImagelConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     string path = value as string; 

     if (path == null || !File.Exists(path)) 
      return null; 

     var bmp = new BitmapImage(); 
     bmp.BeginInit(); 
     bmp.CacheOption = BitmapCacheOption.OnLoad; 
     bmp.UriSource = new Uri(path, UriKind.RelativeOrAbsolute); 
     bmp.EndInit(); 
     return bmp; 
    } 


    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

使易触及的地方转换

<local:PathToBitmapImagelConverter x:Key="PathToBitmapImagelConverter"/> 

在XAML然后使用像

<Image x:Name="MyImage" Source="{Binding FullPhotoPath, Converter={StaticResource PathToBitmapImagelConverter}}"/> 
+0

尼斯,我会尽力的转换器,让你知道 – Brad 2015-04-01 01:52:44

+0

真棒。但是,一个挂断是通过以这种方式设置CacheOption,它实际上不会被设置。它保持为'Default'。我需要使用'BeginInit' /'EndInit'才能生效。如果你不介意,我会编辑你的答案。 – Brad 2015-04-01 03:06:22

相关问题