Это связано с тем, что BitmapImage создается в потоке, отличном от потока пользовательского интерфейса, то есть в потоке, используемом Task.Run. Чтобы сделать BitmapImage доступным из другого потока, его необходимо заморозить. WPF предоставляет класс Freezable для этой цели.
ой XAML:
<ListView MouseDoubleClick="ImageList_MouseDoubleClick" Name="ImageList" Background="#353535" Grid.Row="2" Margin="0 5 0 0">
<ListView.ItemTemplate>
<DataTemplate>
<Grid Cursor="Hand" Width="200" Height="130" VerticalAlignment="Center" HorizontalAlignment="Left">
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition Height="30"/>
</Grid.RowDefinitions>
<Image Source="{Binding ImgPath}" Grid.Row="0"/>
<Label FontSize="14" Foreground="White" Grid.Row="1" HorizontalAlignment="Center" Content="{Binding Name}"/>
</Grid>
</DataTemplate>
</ListView.ItemTemplate>
<ListView.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel Orientation="Horizontal" Width="{Binding Path=ActualWidth, ElementName=ImageList}"/>
</ItemsPanelTemplate>
</ListView.ItemsPanel>
И так я добавляю элементы в ListView:
String[] extensions = { "*.bmp", "*.png", "*.jpg", "*.jpeg", "*.tiff", "*.ico", "*.gif" };
List<String> images = new List<String>();
foreach (String ext in extensions)
{
try
{
images = images.Concat(Directory.GetFiles(path, ext)).ToList();
}
catch { }
}
ObservableCollection<ImageBlock> ImageCollection = new ObservableCollection<ImageBlock>();
foreach (String img in images)
this.ImageList.Items.Add(new ImageBlock(img, System.IO.Path.GetFileName(img)));
Этот код прекрасно работает с небольшим количеством изображений, но когда я пытаюсь открыть папку с более чем 100 картинками, моя программа вылетает. Что я делаю неправильно или что я могу сделать, чтобы оптимизировать свою программу?