C# 在Windows 10应用程序中将图像从图片库填充到ListView

C# 在Windows 10应用程序中将图像从图片库填充到ListView,c#,xaml,listview,windows-store-apps,uwp,C#,Xaml,Listview,Windows Store Apps,Uwp,我正在尝试在windows应用程序中显示从默认图片库到ListView的所有图像,但我只能显示图像的名称,而不是文件夹中的所有图像,这是我的代码 using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Runtime.InteropServices.WindowsRuntime; using Windows.Foundation; using Windows.

我正在尝试在windows应用程序中显示从默认图片库到ListView的所有图像,但我只能显示图像的名称,而不是文件夹中的所有图像,这是我的代码

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices.WindowsRuntime;
using Windows.Foundation;
using Windows.Foundation.Collections;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Controls.Primitives;
using Windows.UI.Xaml.Data;
using Windows.UI.Xaml.Input;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Navigation;
using Windows.UI.Xaml.Media.Imaging;
using Windows.Storage.Streams;
using Windows.Storage;

// The Blank Page item template is documented at http://go.microsoft.com/fwlink/?LinkId=234238

namespace ListView
{
/// <summary>
/// An empty page that can be used on its own or navigated to within a Frame.
/// </summary>
public sealed partial class MainPage : Page
{
    public MainPage()
    {
        this.InitializeComponent();
        showall();
    }

    public async void showall()
    {
        IReadOnlyList<StorageFile> file = await KnownFolders.PicturesLibrary.GetFilesAsync();

        foreach (StorageFile file1 in file)
        {
            list.Items.Add(file1.Name);
        }

    }
使用系统;
使用System.Collections.Generic;
使用System.IO;
使用System.Linq;
使用System.Runtime.InteropServices.WindowsRuntime;
使用Windows基金会;
使用Windows。
使用Windows.UI.Xaml;
使用Windows.UI.Xaml.Controls;
使用Windows.UI.Xaml.Controls.Primitives;
使用Windows.UI.Xaml.Data;
使用Windows.UI.Xaml.Input;
使用Windows.UI.Xaml.Media;
使用Windows.UI.Xaml.Navigation;
使用Windows.UI.Xaml.Media.Imaging;
使用Windows.Storage.Streams;
使用Windows.Storage;
//空白页项模板被记录在http://go.microsoft.com/fwlink/?LinkId=234238
名称空间列表视图
{
/// 
///可以单独使用或在框架内导航到的空页。
/// 
公共密封部分类主页面:第页
{
公共主页()
{
this.InitializeComponent();
showall();
}
公共异步void showall()
{
IReadOnlyList file=等待KnownFolders.PicturesLibrary.GetFileAsync();
foreach(文件中的StorageFile文件1)
{
list.Items.Add(file1.Name);
}
}
这是xaml代码

<Page
x:Class="ListView.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:ListView"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">

    <StackPanel>
        <StackPanel HorizontalAlignment="Left" Width="350" Height="350">
            <ListView Width="300" Height="300" Name="list" SelectionChanged="list_SelectionChanged">
                <Image Width="200" Height="200" Name="img"></Image>
            </ListView>
        </StackPanel>
        <StackPanel VerticalAlignment="Top">

            <Image Width="300" Height="300" Name="img1" />
            <TextBlock Width="300" Height="30" Name="txt1" />

        </StackPanel>
    </StackPanel>


</Grid>


没有从存储文件名到图像的自动转换

您需要两件事,首先是在ListView中使用带有图像控件的DataTemplate:

<ListView x:Name="list">
    <ListView.ItemTemplate>
        <DataTemplate>
            <Image Source="{Binding}"/>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

还请注意,加载是在加载的事件处理程序中完成的,而不是在不等待的情况下直接调用异步方法。事件处理程序是唯一可以安全地
异步无效且不等待的方法。

虽然克莱门斯的方法适用于您,但我想向您展示一种不同的方法。使用ViewModels

以下是PicturesViewModel:

public class PicturesViewModel
{
    public ObservableCollection<ImageSource> MyImages { get; }
        = new ObservableCollection<ImageSource>();

    public async Task GetImages()
    {
        var files = await KnownFolders.PicturesLibrary.GetFilesAsync();
        foreach (var file in files)
        {
            using (var stream = await file.OpenReadAsync())
            {
                BitmapImage image = new BitmapImage();
                await image.SetSourceAsync(stream);
                MyImages.Add(image);
            }
        }
    }
}
而您的ListView只是绑定

<ListView ItemsSource="{Binding MyImages}">
    <ListView.ItemTemplate>
        <DataTemplate>
            <Image Source="{Binding}"/>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>


这是listView设计的图像链接:那么问题出在哪里?绑定这个的xaml在哪里?@AVKNaidu编辑了上面的检查它正在加载每个图片2次,以及如何为这些图片设置像素?加载的处理程序可能被调用了两次(不知道为什么)。我已对其进行了更改,以便它最初会清除列表。除此之外,如何设置像素数据是一个完全不同的问题。请不要在注释中提出后续问题。改为提出有关StackOverflow的新问题。修复了XAML并更改了视图模型,以使用广泛接受的属性名称命名约定。此外,有关的代码注释DataContext错误。ListView从页面继承DataContext,因此设置
list.DataContext
this.DataContext
并不重要。后者更好,因为页面中的其他元素可以绑定到相同的视图模型。另外,从GetImages()返回视图模型实例方法没有意义。在加载的处理程序中实例化视图模型也不是严格要求的。您也可以在MainPage构造函数中这样做。重要的是调用异步GetImages()方法。在进行改进的同时,我还将MyImages集合更改为只读,并将元素类型更改为ImageSource,这是BitmapImage的基类,它在可传递到集合的位图类型数量上提供了更大的灵活性,例如,WriteableBitmap而不是BitmapImage。
private async void MainPage_Loaded(object sender, RoutedEventArgs e)
{
    var viewModel = new PicturesViewModel();
    DataContext = viewModel;

    await viewModel.GetImages();
}
<ListView ItemsSource="{Binding MyImages}">
    <ListView.ItemTemplate>
        <DataTemplate>
            <Image Source="{Binding}"/>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>