图像UriSource和数据绑定

我试图将自定义对象的列表绑定到WPF图像,如下所示:

<Image> <Image.Source> <BitmapImage UriSource="{Binding Path=ImagePath}" /> </Image.Source> </Image> 

但它不起作用。 这是我得到的错误:

“必须设置属性”UriSource“或属性”StreamSource“。

我错过了什么?

WPF内置了某些types的转换器。 如果将图像的Source属性绑定到stringUri值,那么WPF将使用ImageSourceConverter将值转换为ImageSource

所以

 <Image Source="{Binding ImageSource}"/> 

将工作,如果ImageSource属性是一个有效的URI到图像的string表示。

你当然可以滚动你自己的绑定转换器:

 public class ImageConverter : IValueConverter { public object Convert( object value, Type targetType, object parameter, CultureInfo culture) { return new BitmapImage(new Uri(value.ToString())); } public object ConvertBack( object value, Type targetType, object parameter, CultureInfo culture) { throw new NotSupportedException(); } } 

并像这样使用它:

 <Image Source="{Binding ImageSource, Converter={StaticResource ImageConverter}}"/> 

Atul Gupta 撰写的这篇文章提供了涵盖以下几种情况的示例代码:

  1. 将常规资源图像绑定到XAML中的Source属性
  2. 绑定资源图片,但是来自后面的代码
  3. 通过使用Application.GetResourceStream绑定后台代码中的资源图像
  4. 通过内存stream从文件path加载图像(从数据库加载博客图像数据时也是如此)
  5. 从文件path加载图像,但通过使用绑定到文件path属性
  6. 将图像数据绑定到内部具有通过依赖属性进行图像控制的用户控件
  7. 与第5点相同,但也确保文件不被locking在硬盘上

您也可以简单地设置Source属性而不是使用子元素。 要做到这一点,你的类需要返回图像作为位图图像。 这是我做过的一个例子

 <Image Width="90" Height="90" Source="{Binding Path=ImageSource}" Margin="0,0,0,5" /> 

而类属性就是这样

 public object ImageSource { get { BitmapImage image = new BitmapImage(); try { image.BeginInit(); image.CacheOption = BitmapCacheOption.OnLoad; image.CreateOptions = BitmapCreateOptions.IgnoreImageCache; image.UriSource = new Uri( FullPath, UriKind.Absolute ); image.EndInit(); } catch{ return DependencyProperty.UnsetValue; } return image; } } 

我想这可能比价值转换器多一点工作,但这是另一种select。

你需要有一个IValueConverter接口的实现将uri转换成图像。 IValueConverter的Convert实现如下所示:

 BitmapImage image = new BitmapImage(); image.BeginInit(); image.UriSource = new Uri(value as string); image.EndInit(); return image; 

那么你将需要在你的绑定中使用转换器:

 <Image> <Image.Source> <BitmapImage UriSource="{Binding Path=ImagePath, Converter=...}" /> </Image.Source> </Image> 

这里select的答案的问题是,当来回导航时,转换器将在每次显示页面时被触发。

这将导致不断创build新的文件句柄,并会阻止任何删除文件的尝试,因为它仍在使用中。 这可以通过使用Process Explorer进行validation。

如果图像文件可能在某个时候被删除,可以使用如下所示的转换器: 使用XAML将System.Drawing.Image绑定到System.Windows.Image控件

这种内存stream方法的缺点是每次都会加载和解码图像,并且无法进行caching:“为了防止图像被多次解码,请从Uri分配Image.Source属性,而不是使用内存stream“来源:”使用XAML的Windowsapp store应用的性能提示“

为了解决性能问题,可以使用存储库模式来提供caching层。 caching可能会在内存中发生,这可能会导致内存问题,或作为缩略图文件驻留在临时文件夹中,当应用程序退出时可以将其清除。

你可以使用

ImageSourceConverter类

得到你想要的

  img1.Source = (ImageSource)new ImageSourceConverter().ConvertFromString("/Assets/check.png");