2009-11-19 34 views
10

Tôi đang làm việc trên một ứng dụng quản lý hình ảnh trong WPF hiển thị một số hình ảnh và cho phép người dùng di chuyển chúng xung quanh hệ thống tệp. Vấn đề tôi gặp phải là hiển thị tệp có phần tử <Image> dường như giữ tệp mở, do đó, các nỗ lực di chuyển hoặc xóa tệp không thành công. Có cách nào để tự hỏi WPF để dỡ bỏ hoặc phát hành một tập tin để nó có thể được di chuyển? Hoặc có phương pháp hiển thị hình ảnh không giữ tệp mở không? Trình xem Xaml bên dưới:Hiển thị hình ảnh trong WPF mà không cần giữ tập tin mở

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

Trả lời

15

ItemsSource của số ListBox của bạn là gì? Danh sách các chuỗi chứa đường dẫn hình ảnh?

Thay vì mặc nhiên bằng cách sử dụng built-in chuyển đổi từ chuỗi ImageSource, sử dụng một bộ chuyển đổi tùy chỉnh để đóng dòng sau khi bạn tải hình ảnh:

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

gia tăng này và nó đã làm việc. Cảm ơn! image.CacheOption = BitmapCacheOption.OnLoad; –

+0

Hình như image.CacheOption = BitmapCacheOption.OnLoad; nên được gọi sau image.BeginInit(); . Khi tôi gán nó sau cuộc gọi khởi tạo và trước khi BeginInit() hình ảnh không được hiển thị. – SKG

+0

Caveat: Giải pháp này là * rất * chậm. Hiện đang cố gắng tìm ra cách tăng tốc, nhưng không tốt cho việc tải nhiều hình ảnh. – rookie1024

Các vấn đề liên quan