Показать изображение в WPF, не открывая файл - PullRequest
11 голосов
/ 19 ноября 2009

Я работаю над приложением для управления изображениями в WPF, которое отображает несколько изображений и позволяет пользователю перемещать их по файловой системе. Проблема, с которой я столкнулся, заключается в том, что при отображении файла с элементом <Image> файл остается открытым, поэтому попытка переместить или удалить файл не удалась. Есть ли способ вручную попросить WPF выгрузить или выпустить файл, чтобы его можно было переместить? Или есть способ отображения изображений, который не держит файл открытым? Зритель 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 Ответ

15 голосов
/ 19 ноября 2009

Что такое 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;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...