2009-11-19 2 views
10

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

<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> 

ответ

15

Что такое 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; 
     } 
    } 
} 
+1

Добавлено это, и она работала. Благодаря! image.CacheOption = BitmapCacheOption.OnLoad; –

+0

Похоже на image.CacheOption = BitmapCacheOption.OnLoad; должен быть вызван после изображения.BeginInit(); , Когда я назначил его после вызова инициализации и до BeginInit(), изображение не отображалось. – SKG

+0

Предостережение: это решение * очень медленно. В настоящее время пытается выяснить, как ускорить его, но это не очень удобно для загрузки большого количества изображений. – rookie1024

Смежные вопросы