2009-11-19 14 views
10

Sto lavorando a un'applicazione di gestione delle immagini in WPF che visualizza un numero di immagini e consente all'utente di spostarle nel file system. Il problema che ho riscontrato è che la visualizzazione di un file con un elemento <Image> sembra contenere il file aperto, quindi i tentativi di spostare o eliminare il file non riescono. C'è un modo per chiedere manualmente a WPF di scaricare o rilasciare un file in modo che possa essere spostato? O esiste un metodo per visualizzare le immagini che non tengono aperto il file? Visualizzatore Xaml di seguito:Visualizzare un'immagine in WPF senza tenere il file aperto

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

risposta

15

Qual è il ItemsSource del vostro ListBox? Un elenco di stringhe contenenti i percorsi dell'immagine?

Invece di implicitamente utilizzando il convertitore incorporato da stringa a ImageSource, utilizzare un convertitore personalizzato per chiudere il flusso dopo aver caricato l'immagine:

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

aggiunte questo e ha funzionato. Grazie! image.CacheOption = BitmapCacheOption.OnLoad; –

+0

Sembra image.CacheOption = BitmapCacheOption.OnLoad; dovrebbe essere chiamato dopo image.BeginInit(); . Quando l'ho assegnato dopo la chiamata di inizializzazione e prima di BeginInit() l'immagine non è stata visualizzata. – SKG

+0

Avvertenza: questa soluzione è * molto * lenta. Attualmente sto cercando di capire come accelerarlo, ma non è buono per caricare un sacco di immagini. – rookie1024

Problemi correlati