2013-05-11 55 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界面并完成)。

相关问题