2

我对 WPF 有点陌生,但我必须这样做,这需要我很多时间。我一直在寻找解决方案,但有很多替代解决方案,老实说,我大部分都不明白。我有这个 XAML 代码:

<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 个元素,一直拉伸(虽然我看不到正在显示的内容)。

4

2 回答 2

4

在您的第一次尝试中,您将FileInfo对象添加到 ListView 的项目集合中。ImageSource根据 DataTemplate 中的绑定要求,这些不会自动转换为项目。FullName改为添加 FileInfo :

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)));
}

两种解决方案之间的区别在于,在第二种解决方案中,您手动创建图像对象,而第一种解决方案依赖于从stringto的自动转换ImageSource,它作为 TypeConverter 内置在 WPF 中。


您的第二个问题的解决方案是替换 ListView's ItemsPanel,也许是UniformGrid

<ListView Name="Thumbnails">
    <ListView.ItemsPanel>
        <ItemsPanelTemplate>
            <UniformGrid Columns="4"/>
        </ItemsPanelTemplate>
    </ListView.ItemsPanel>
    ...
</ListView>
于 2013-05-11T14:58:20.413 回答
0

作为一般规则,您应该记住在代码隐藏文件(.xaml.cs 文件)中添加图像是不好的做法。在 WPF 中有一种非常广泛使用且常见的设计模式,称为 MVVM (Model-View-ViewModel),您应该熟悉和使用它。在您的情况下,您应该有一个 ViewModel 类,其中包含一个IEnumerable<BitmapImage>属性,该属性包含您希望在ListView.

例如,假设您的 ViewModel 类称为 ImagesViewModel,而您的视图是 ImagesView:

ImagesViewModel将有一个名为的属性:

ObservableCollection<BitmapImage> Images

ImagesView将包含:

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

现在,如果您向图像添加/删除图像,它们将自动从您的列表视图中添加/删除(您必须INotifyPropertyChanged在视图模型中实现接口,然后就完成了)。

于 2014-02-25T08:13:51.413 回答