使用http:\\ URL的WPF图像UriSource和数据绑定
我在WPF用户控件中显示带有Web URL的图像时遇到问题。 我已经解决了2008年8月在本网站上提出的类似问题的所有建议( 图像UriSource和数据绑定 ),但这些建议都没有奏效。
我想做的是:
ImageFilePathUri是一个从字符串路径创建的Uri:
public Uri ImageFilePathUri { get { return new Uri(this.ImageFilePath); } } }
这样就必须设置“Property’UriSource’或属性’StreamSource’。” 错误如预期。
我也尝试过使用值转换器:
public class ImageConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { var image = new BitmapImage(); image.BeginInit(); if (value != null) { image.UriSource = new Uri((string)value); } image.DecodePixelWidth = 50; image.EndInit(); return image; } }
但是,使用以下方法绑定它:
不显示图像。
在控件构造函数和/或控件Loaded事件中以编程方式加载图像的进一步尝试也没有奏效:
if (this.MemberRollItemViewModel.Member != null) { var image = new BitmapImage(); image.BeginInit(); image.UriSource = new Uri(this.MemberRollItemViewModel.Member.ImageFilePath); image.DecodePixelWidth = 50; image.EndInit(); this.MemberImage.Source = image; }
有一件事是将图像保存到本地文件路径并显示:
这显然仅在调试问题时有用,而不是解决方案。 相同的代码但用http地址替换本地文件路径不起作用。
更新:
这是MemberImage属性实现。
public BitmapImage MemberImage { get { var image = new BitmapImage(); if (this.Member != null) { WebRequest request = WebRequest.Create(new Uri(this.Member.ImageFilePath, UriKind.Absolute)); request.Timeout = -1; WebResponse response = request.GetResponse(); Stream responseStream = response.GetResponseStream(); BinaryReader reader = new BinaryReader(responseStream); MemoryStream memoryStream = new MemoryStream(); byte[] bytebuffer = new byte[BytesToRead]; int bytesRead = reader.Read(bytebuffer, 0, BytesToRead); while (bytesRead > 0) { memoryStream.Write(bytebuffer, 0, bytesRead); bytesRead = reader.Read(bytebuffer, 0, BytesToRead); } image.BeginInit(); memoryStream.Seek(0, SeekOrigin.Begin); image.StreamSource = memoryStream; image.EndInit(); } return image; } }
更新:
这是我在视图中绑定到控件的方式:
MemberImage是我上面给出的属性。 正在设置我的数据上下文,因为正在运行该属性,它只是不返回图像。
WebURL不能作为BitmapImage的UriSource属性的源提供。 如果是weburl,则需要在本地下载该映像并将该路径绑定到UriSource。 见下文
更新:
void MainWindow_Loaded(object sender, RoutedEventArgs e) { var image = new BitmapImage(); int BytesToRead=100; WebRequest request = WebRequest.Create(new Uri("http://sofzh.miximages.com/c%23/f", UriKind.Absolute)); request.Timeout = -1; WebResponse response = request.GetResponse(); Stream responseStream = response.GetResponseStream(); BinaryReader reader = new BinaryReader(responseStream); MemoryStream memoryStream = new MemoryStream(); byte[] bytebuffer = new byte[BytesToRead]; int bytesRead = reader.Read(bytebuffer, 0, BytesToRead); while (bytesRead > 0) { memoryStream.Write(bytebuffer, 0, bytesRead); bytesRead = reader.Read(bytebuffer, 0, BytesToRead); } image.BeginInit(); memoryStream.Seek(0, SeekOrigin.Begin); image.StreamSource = memoryStream; image.EndInit(); myImage.Source = image; }