You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在UWP中使用C#获取文件夹内的图片缩略图?

我之前也在UWP里折腾过获取图片缩略图的需求,结合XAML绑定确实有几个容易踩坑的点,一步步给你讲清楚怎么实现从库文件夹里获取并展示缩略图:

第一步:先配置必要的权限

UWP对文件访问权限管控很严,要访问图片库这类系统库文件夹,必须先在Package.appxmanifest里声明权限:

  • 打开你的项目的Package.appxmanifest文件,切换到“功能”标签页,勾选“图片库”
  • 或者直接编辑XML代码,在<Capabilities>节点里添加:
<uap:Capability Name="picturesLibrary" />

如果是访问其他库(比如文档库),对应勾选或添加对应的权限声明即可。

第二步:获取目标库文件夹

UWP提供了KnownFolders类来直接访问系统库,比如图片库可以直接用KnownFolders.PicturesLibrary,不用让用户手动选择文件夹(前提是权限已经配置好)。

第三步:筛选图片文件并生成缩略图

接下来要异步获取文件夹里的图片文件,然后为每个文件生成缩略图。这里建议封装一个ViewModel类来存储文件名和缩略图,方便后续XAML绑定:

using Windows.Storage;
using Windows.Storage.FileProperties;
using Windows.UI.Xaml.Media.Imaging;

// 用于绑定的实体类
public class ImageThumbnailItem
{
    public string FileName { get; set; }
    public BitmapImage Thumbnail { get; set; }
}

// 获取缩略图的核心方法
public async Task<List<ImageThumbnailItem>> GetLibraryThumbnailsAsync()
{
    var thumbnailList = new List<ImageThumbnailItem>();
    
    // 获取目标库文件夹(这里以图片库为例)
    var targetFolder = KnownFolders.PicturesLibrary;
    
    // 设置查询规则,只筛选指定格式的图片文件
    var queryOptions = new QueryOptions(CommonFileQuery.DefaultQuery, 
        new[] { ".jpg", ".jpeg", ".png", ".gif", ".bmp" });
    var imageFileQuery = targetFolder.CreateFileQueryWithOptions(queryOptions);
    
    // 异步获取所有符合条件的文件
    var imageFiles = await imageFileQuery.GetFilesAsync();
    
    foreach (var file in imageFiles)
    {
        // 获取缩略图:指定模式为图片视图,大小设为100px(可根据需求调整)
        using (var thumbnailStream = await file.GetThumbnailAsync(
            ThumbnailMode.PicturesView, 
            100, 
            ThumbnailOptions.ResizeThumbnail))
        {
            if (thumbnailStream != null && thumbnailStream.Size > 0)
            {
                var bitmap = new BitmapImage();
                await bitmap.SetSourceAsync(thumbnailStream);
                
                thumbnailList.Add(new ImageThumbnailItem
                {
                    FileName = file.Name,
                    Thumbnail = bitmap
                });
            }
        }
    }
    
    return thumbnailList;
}
第四步:结合XAML绑定展示缩略图

为了让UI能实时响应数据变化,我们用ObservableCollection来存储数据,然后在页面的代码后台初始化数据:

using Windows.UI.Xaml.Controls;
using System.Collections.ObjectModel;

public sealed partial class MainPage : Page
{
    public ObservableCollection<ImageThumbnailItem> ThumbnailItems { get; set; } 
        = new ObservableCollection<ImageThumbnailItem>();

    public MainPage()
    {
        this.InitializeComponent();
    }

    protected override async void OnNavigatedTo(Windows.UI.Xaml.Navigation.NavigationEventArgs e)
    {
        base.OnNavigatedTo(e);
        // 异步获取缩略图并添加到集合中
        var items = await GetLibraryThumbnailsAsync();
        foreach (var item in items)
        {
            ThumbnailItems.Add(item);
        }
    }
}

然后在XAML里用GridView或者ListView来展示:

<GridView ItemsSource="{x:Bind ThumbnailItems, Mode=OneWay}" Margin="20">
    <GridView.ItemTemplate>
        <DataTemplate x:DataType="local:ImageThumbnailItem">
            <StackPanel Margin="10" HorizontalAlignment="Center">
                <!-- 展示缩略图 -->
                <Image Source="{x:Bind Thumbnail, Mode=OneWay}" 
                       Width="100" Height="100" 
                       Stretch="UniformToFill"
                       CornerRadius="4"/>
                <!-- 展示文件名 -->
                <TextBlock Text="{x:Bind FileName, Mode=OneWay}" 
                           Margin="0,8,0,0" 
                           TextWrapping="Wrap" 
                           HorizontalAlignment="Center"
                           MaxWidth="100"/>
            </StackPanel>
        </DataTemplate>
    </GridView.ItemTemplate>
    <!-- 设置网格布局 -->
    <GridView.ItemsPanel>
        <ItemsPanelTemplate>
            <ItemsWrapGrid Orientation="Horizontal" ItemWidth="120" ItemHeight="140"/>
        </ItemsPanelTemplate>
    </GridView.ItemsPanel>
</GridView>
几个容易忽略的关键点
  • 异步操作一定要到位:所有文件和缩略图的获取都是异步方法,别在UI线程同步调用,否则会导致界面卡死
  • 缩略图模式选择:ThumbnailMode.PicturesView是专门为图片优化的模式,如果是视频文件可以用ThumbnailMode.VideosView,选对模式能得到更清晰合适的缩略图
  • 释放资源:用using包裹缩略图的IRandomAccessStream,避免内存泄漏
  • 用ObservableCollection:如果直接用List,添加数据后UI不会自动刷新,必须用ObservableCollection来实现数据绑定的自动更新

内容的提问来源于stack exchange,提问作者Kay

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:49:48