gpt4 book ai didi

c# - 使用 http :\\URL 的 WPF 图像 UriSource 和数据绑定(bind)

转载 作者:太空狗 更新时间:2023-10-29 20:06:18 24 4
gpt4 key购买 nike

我在 WPF 用户控件中显示带有 Web URL 的图像时遇到问题。对于 2008 年 8 月在本网站上提出的类似问题,我已经完成了所有建议 (Image UriSource and Data Binding),但这些建议都没有奏效。

我想做的是:

<Image Width="50" Name="MemberImage">
<Image.Source>
<BitmapImage DecodePixelWidth="50" UriSource="{Binding Member.ImageFilePathUri}" />
</Image.Source>
</Image>

ImageFilePathUri 是通过以下字符串路径创建的 Uri:

public Uri ImageFilePathUri
{
get
{
return new Uri(this.ImageFilePath);
}
}
}

这给出了“必须设置属性‘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;
}
}

但是,绑定(bind)到它使用:

<Image Name="TestImage" Width="50" Source="{Binding Path=Member.ImageFilePath, Converter=Parliament.HansardApplicationSuite.Logging.Helpers.ImageConverter}"></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;
}

有用的一件事是将图像保存到本地文件路径并显示:

<Image Width="50" Name="MemberImage">
<Image.Source>
<BitmapImage DecodePixelWidth="50" UriSource="C:\Data\6bc64e7b-2df5-40d5-b6c4-eaf732318222.jpg" />
</Image.Source>
</Image>

这显然只对调试问题有用,不是解决方案。相同的代码但用 http 地址代替本地文件路径不起作用。

<Image.Source>
<BitmapImage DecodePixelWidth="50" UriSource="http://member.org/6bc64e7b-2df5-40d5-b6c4-eaf732318222.jpg" />
</Image.Source>

更新:

这是 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;
}
}

更新:

这就是我绑定(bind)到 View 中的控件的方式:

<Image Width="50" Source="{Binding MemberImage}" />

MemberImage 是我在上面给出的属性。我的数据上下文设置正确,因为该属性正在运行,只是没有返回图像。

最佳答案

WebURL 不能作为源提供给 BitmapImage 的 UriSource 属性。如果是 weburl,则需要在本地下载该图像并将该路径绑定(bind)到 UriSource。见下文

http://blogs.windowsclient.net/cennest/archive/2010/03/26/code-for-keeps-wpf-silverlight-retrieve-images-from-db-url.aspx

更新:

void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
var image = new BitmapImage();
int BytesToRead=100;

WebRequest request = WebRequest.Create(new Uri("http://www.interweb.in/attachments/pc-wallpapers/16187d1222942178-nature-wallpaper-nature-summer-wallpaper.jpg", 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;
}

关于c# - 使用 http :\\URL 的 WPF 图像 UriSource 和数据绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3148163/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com