У меня есть проблема при отображении изображения с веб-URL в пользовательском элементе управления WPF. Я работал через все предложения на подобную проблему, которую спрашивают относительно этого сайта в августе 2008 (Отобразите UriSource и Привязку данных), но ни одно из тех предложений не работало.
То, что я хотел бы сделать:
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;
}
}
Однако связывая с ним использование:
не отображает изображение.
Дальнейшая попытка загрузить изображение программно, в конструкторе управления и/или событии 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 не может быть указан в качестве источника для свойства UriSource BitmapImage. Если это 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;
}