Отображение изображения в WPF без открытия файла

Я работаю над приложением управления изображениями в WPF, которое отображает несколько изображений и позволяет пользователю перемещать их вокруг файловой системы. Проблема, с которой я столкнулся, заключается в том, что отображение файла с элементом <Image> означает, что файл открыт, поэтому попытки перемещения или удаления файла не выполняются. Есть ли способ вручную попросить WPF выгрузить или выпустить файл, чтобы его можно было перемещать? Или есть способ отображения изображений, которые не удерживают файл открытым? Viewer Xaml ниже:

<ListBox x:Name="uxImages" ScrollViewer.HorizontalScrollBarVisibility="Disabled">
            <ListBox.ItemsPanel>
                <ItemsPanelTemplate>
                    <WrapPanel Orientation="Horizontal" />
                </ItemsPanelTemplate>
            </ListBox.ItemsPanel>

            <ListBox.ItemTemplate>
                <DataTemplate>
                    <Border Margin="4">
                        <Image Source="{Binding}" Width="150" Height="150"/>
                    </Border>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>

Ответ 1

Что такое ItemsSource вашего ListBox? Список строк, содержащих пути изображения?

Вместо того, чтобы неявно использовать встроенный конвертер из строки в ImageSource, используйте пользовательский конвертер, чтобы закрыть поток после загрузки изображения:

public class PathToImageConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        string path = value as string;
        if (path != null)
        {
            BitmapImage image = new BitmapImage();
            using (FileStream stream = File.OpenRead(path))
            {
                image.BeginInit();
                image.StreamSource = stream;
                image.CacheOption = BitmapCacheOption.OnLoad;
                image.EndInit(); // load the image from the stream
            } // close the stream
            return image;
        }
    }
}