图像UriSource和数据绑定
我试图将自定义对象的列表绑定到WPF图像,如下所示:
<Image> <Image.Source> <BitmapImage UriSource="{Binding Path=ImagePath}" /> </Image.Source> </Image>
但它不起作用。 这是我得到的错误:
“必须设置属性”UriSource“或属性”StreamSource“。
我错过了什么?
WPF内置了某些types的转换器。 如果将图像的Source
属性绑定到string
或Uri
值,那么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 撰写的这篇文章提供了涵盖以下几种情况的示例代码:
- 将常规资源图像绑定到XAML中的Source属性
- 绑定资源图片,但是来自后面的代码
- 通过使用Application.GetResourceStream绑定后台代码中的资源图像
- 通过内存stream从文件path加载图像(从数据库加载博客图像数据时也是如此)
- 从文件path加载图像,但通过使用绑定到文件path属性
- 将图像数据绑定到内部具有通过依赖属性进行图像控制的用户控件
- 与第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");