Мой ItemTemplate очень простой, один TextBlock для отображения Имя, другой Image для отображения Чистое изображение:
<ListBox.ItemTemplate>
<DataTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width = "Auto"/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Image VerticalAlignment = "Center" Source = "{Binding Url, Mode=OneWay, Converter = {StaticResource cvtImage}}" Width = "30" Height = "30"/>
<TextBlock Grid.Column = "1" Text = "{Binding Name, Mode=OneWay}" Margin = "5" VerticalAlignment = "Center"/>
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
Вот мой массив изображений:
private int[] numArr =
{
20333581,
65476272,
65494751,
67810732,
72685857,
73794129,
74292128,
78448608,
89297529,
109457648,
128775798,
136864278,
140889893,
155315730,
155707244,
158590544,
160382605,
162265810,
167648987,
170883246,
175708510,
181177782,
};
private List<ImageItem> imagesList = new List<ImageItem>();
private int imageCount = 22;
private void initialImageList()
{
for (int i = 0; i < imageCount; i++)
{
imagesList.Add(new ImageItem {
Name = "item " + (i + 1).ToString(),
Url = String.Format("https://p.qlogo.cn/gh/{0}/{0}_1/40", numArr[i], numArr[i])
});
}
}
Сетевые изображения выше действительны.
Класс ImageItem простой с двумя свойствами: Name и Url
Вот мой класс преобразователь:
class GcToNetImageConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var url = (string)value;
Console.WriteLine("url is " + url);
try
{
return new BitmapImage(new Uri(url));
}
catch (Exception ex)
{
Console.WriteLine("ex message: {0}", ex.Message);
return new BitmapImage();
}
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
После настройки lb.ItemsSource = this.imagesList;,
когда вы скользите вниз по ListBox, вы обязательно получите IOException.
Я предполагаю, что это что-то с утечкой памяти
@richej Я разместил конвертер
Проблема с номером 170883246. Понятия не имею, что с ним не так.
@richej нет, я могу получить https://p.qlogo.cn/gh/170883246/170883246_1/40 изображение
да, я знаю, но это все равно вызывает проблему. При удалении работает. Я понял это, сначала загрузив все байты изображения, а затем преобразовав byte[] в растровое изображение. Этот последний шаг не работает для этого конкретного изображения.
@richej, вы правы, это вызывает проблему, возможно, его нельзя преобразовать в Bitmap. И как решить эту проблему? любой хороший совет?





Я использую этот код для захвата исключения:
try
{
var c = new WebClient();
var bytes = c.DownloadData(url);
var ms = new MemoryStream(bytes);
var bi = new BitmapImage();
bi.BeginInit();
bi.StreamSource = ms;
bi.EndInit();
return bi;
}
catch (Exception ex)
{
Console.WriteLine("ex message: {0}", ex.Message);
return new BitmapImage();
}
теперь я могу получить исключение, но я все еще не могу показать изображение https://p.qlogo.cn/gh/170883246/170883246_1/40.
Изображение может быть показано в веб-браузере. Я не понимаю, почему DotNet BitmapImage не может его использовать.
Можете ли вы опубликовать конвертер cvtImage, пожалуйста?