2013-05-11 56 views
2

我對WPF很陌生,但我必須這樣做,這需要我很多時間。我尋找一個解決方案,但有很多替代解決方案,我真的不明白大部分。我有這樣的XAML代碼:WPF:ListView與來自文件夾的圖像

<ListView Name="Thumbnails"> 
    <ListView.ItemTemplate> 
     <DataTemplate> 
      <Image Source="{Binding}" Height="30" Width="30" Margin="5"/> 
     </DataTemplate> 
    </ListView.ItemTemplate> 
</ListView> 

除了這個隱藏代碼:

private void Window_Loaded(object sender, RoutedEventArgs e) 
{ 
    DirectoryInfo folder = new DirectoryInfo(Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName) + @"\SlikeSportista\"); 
    FileInfo[] images = folder.GetFiles("*.jpg"); 
    foreach (FileInfo img in images) 
    { 
     Thumbnails.Items.Add(img); 
    } 
} 

我也試過在foreach循環中這行代碼:

Thumbnails.Items.Add(System.Drawing.Image.FromFile(img.FullName)); 

在這兩種情況下,這些項目被添加,但是圖像顯示不正確,或者完全沒有。您可以選擇它們,並且文件夾中的元素數量相同,但沒有顯示。

另一個問題(不太重要的一個)將是如何以正方形而不是行來顯示圖像。基本上我想每行有大約4個左右的圖像,但是現在我每行只有1個元素,一直延伸(儘管我看不到正在顯示的內容)。

+0

而不是使用Process.GetCurrentProcess()。MainModule.FileName會不會更容易使用相對路徑? – user1069816 2014-12-30 22:32:26

回答

4

在您的第一次嘗試中,您將FileInfo對象添加到ListView的項目集合中。這些不會自動轉換爲ImageSource項目,如DataTemplate中的綁定所要求的。添加FileInfo中FullName代替:

foreach (FileInfo img in images) 
{ 
    Thumbnails.Items.Add(img.FullName); 
} 

在你的第二次嘗試,問題是你加的System.Drawing.Image情況下,這是不是WPF的一部分,但WinForms的,並且也不會被自動轉換。您可以使用BitmapImage代替:

foreach (FileInfo img in images) 
{ 
    Thumbnails.Items.Add(new BitmapImage(new Uri(img.FullName))); 
} 

這兩種解決方案之間的差別是,在第二個手動創建圖像對象,而第一個依賴於自動轉換從stringImageSource,它內置在WPF作爲類型轉換器。


一個關於第二個問題的解決辦法是更換ListView的ItemsPanel,或許由UniformGrid

<ListView Name="Thumbnails"> 
    <ListView.ItemsPanel> 
     <ItemsPanelTemplate> 
      <UniformGrid Columns="4"/> 
     </ItemsPanelTemplate> 
    </ListView.ItemsPanel> 
    ... 
</ListView> 
+0

謝謝,這很有幫助。它不僅解決了我的問題,而且還幫助我更好地理解爲什麼首先出現問題(在對函數進行更多檢查之後)。謝謝一堆! – user2352164 2013-05-11 18:48:11

0

作爲一般規則,你應該記住的是,在代碼 - 添加圖像在文件後面(.xaml.cs文件)是不好的做法。在WPF中有一個非常廣泛使用的常用設計模式,稱爲MVVM(Model-View-ViewModel),您應該熟悉並使用它。在你的情況下,你應該有一個包含IEnumerable<BitmapImage>屬性的ViewModel類,它包含你想在你的ListView中顯示的圖像。

例如,假設你的視圖模型類被稱爲ImagesViewModel,你的看法是ImagesView:

ImagesViewModel會有一個叫做屬性:

ObservableCollection<BitmapImage> Images

ImagesView將包含:

<ListView Name="Thumbnails" ItemsSource="{Binding Images}"> 
<ListView.ItemsPanel> 
    <ItemsPanelTemplate> 
     <UniformGrid Columns="4"/> 
    </ItemsPanelTemplate> 
</ListView.ItemsPanel> 
... 

現在,如果您向圖像添加/刪除圖像,它們將自動從列表視圖中添加/刪除(您必須在視圖模型中實現INotifyPropertyChanged界面並完成)。

相關問題