Val*_*l M 7 c# data-binding url wpf xaml
我在WPF用户控件中显示带有Web URL的图像时遇到问题.我已经解决了2008年8月在本网站上提出的类似问题的所有建议(图像UriSource和数据绑定),但这些建议都没有奏效.
我想做的是:
<Image Width="50" Name="MemberImage">
<Image.Source>
<BitmapImage DecodePixelWidth="50" UriSource="{Binding Member.ImageFilePathUri}" />
</Image.Source>
</Image>
Run Code Online (Sandbox Code Playgroud)
ImageFilePathUri是一个从字符串路径创建的Uri:
public Uri ImageFilePathUri
{
get
{
return new Uri(this.ImageFilePath);
}
}
}
Run Code Online (Sandbox Code Playgroud)
这样就必须设置"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;
}
}
Run Code Online (Sandbox Code Playgroud)
但是,使用以下方法绑定它:
<Image Name="TestImage" Width="50" Source="{Binding Path=Member.ImageFilePath, Converter=Parliament.HansardApplicationSuite.Logging.Helpers.ImageConverter}"></Image>
Run Code Online (Sandbox Code Playgroud)
不显示图像.
在控件构造函数和/或控件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;
}
Run Code Online (Sandbox Code Playgroud)
有一件事是将图像保存到本地文件路径并显示:
<Image Width="50" Name="MemberImage">
<Image.Source>
<BitmapImage DecodePixelWidth="50" UriSource="C:\Data\6bc64e7b-2df5-40d5-b6c4-eaf732318222.jpg" />
</Image.Source>
</Image>
Run Code Online (Sandbox Code Playgroud)
这显然仅在调试问题时有用,而不是解决方案.相同的代码但用http地址替换本地文件路径不起作用.
<Image.Source>
<BitmapImage DecodePixelWidth="50" UriSource="http://member.org/6bc64e7b-2df5-40d5-b6c4-eaf732318222.jpg" />
</Image.Source>
Run Code Online (Sandbox Code Playgroud)
更新:
这是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;
}
}
Run Code Online (Sandbox Code Playgroud)
更新:
这是我在视图中绑定到控件的方式:
<Image Width="50" Source="{Binding MemberImage}" />
Run Code Online (Sandbox Code Playgroud)
MemberImage是我上面给出的属性.正在设置我的数据上下文,因为该属性正在运行,它只是没有返回图像.
Rag*_*han 12
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://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;
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
26472 次 |
最近记录: |