首页 > 解决方案 > WPF 图像集合到 ListView 而不使用文件路径

问题描述

我正在开发一个视觉应用程序,并且有一个相机可以拍摄照片并将它们作为位图存储在一个集合中。

有没有办法将位图图像添加到源中没有文件路径的列表视图?

我已经可以将图像写入磁盘,然后在 ListView 中显示它们。该方法的问题在于图像的数量。机器将在 24/7 运行时每秒拍摄 3 张照片。我怀疑我会在短时间内摧毁SSD。

所以我想找到一个更好的方法。我不必使用 listView 并且到目前为止我看到的所有示例都是使用磁盘文件路径的各种风格。如果有更好的收藏可以使用,我很乐意改变。

谢谢你的建议。

我无法让它工作:https ://docs.microsoft.com/en-us/dotnet/api/system.windows.media.imaging.bitmapsource?redirectedfrom=MSDN&view=netcore-3.1我认为这是最有希望的. 但我正在使用 System.Drawing.Imaging。

标签: c#wpfwindows

解决方案


您的视图模型应该公开一个具有ImageSourceBitmapSource作为元素类型的集合属性:

对于从Sytem.Drawing.Bitmapto的转换BitmapSource,请参见例如这个问题:fast convert Bitmap to BitmapSource wpf,或者这个:Load a WPF BitmapImage from a System.Drawing.Bitmap

public class ViewModel
{
    public ObservableCollection<BitmapSource> Images { get; }
        = new ObservableCollection<BitmapSource>();

    public void AddImage(System.Drawing.Bitmap bitmap)
    {
        Images.Add(Convert(bitmap));
    }

    public static BitmapSource Convert(System.Drawing.Bitmap bitmap)
    {
        ...
    }
}

将视图模型的实例分配给视图的 DataContext,并填充集合:

public partial class MainWindow : Window
{
    private readonly ViewModel viewModel = new ViewModel();

    public MainWindow()
    {
        InitializeComponent();
        DataContext = viewModel;
    }
}

像这样绑定一个 ListBox:

<ListBox ItemsSource="{Binding Images}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <Image Source="{Binding}"/>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

推荐阅读