【问题标题】:WinRT GridView crashesWinRT GridView 崩溃
【发布时间】:2014-03-19 19:00:06
【问题描述】:

当显示超过 13 个(12 个或更少工作正常)大图像 (3264x2448) 缩小为 320x180 图像项时 - GridView 崩溃并出现非托管异常:0x7583A862 (combase.dll) 处的未处理异常。

Xaml:

<GridView x:Name="ImagesGridView" HorizontalAlignment="Stretch" Height="Auto" VerticalAlignment="Stretch" Width="Auto">
    <GridView.ItemTemplate>
        <DataTemplate>
            <Image Stretch="Fill" Source="{Binding Source}" Height="180" Width="320" />
        </DataTemplate>
    </GridView.ItemTemplate>
    <GridView.ItemsPanel>
        <ItemsPanelTemplate>
            <WrapGrid Orientation="Horizontal" />
        </ItemsPanelTemplate>
    </GridView.ItemsPanel>
</GridView>

加载代码:

private static async Task<BitmapImage> LoadImage(StorageFile file)
    {
        var bitmapImage = new BitmapImage();
        var stream = (FileRandomAccessStream)await file.OpenAsync(FileAccessMode.Read);

        bitmapImage.SetSource(stream);

        stream.CloneStream();
        return bitmapImage;

    }

    public async void GetPictures()
    {
        var queryOptions = new QueryOptions(CommonFileQuery.OrderByName, new[] { ".png", ".jpg" });
        var picturesQuery = await KnownFolders.PicturesLibrary.CreateFileQueryWithOptions(queryOptions).GetFilesAsync();
        foreach (var pictureFile in picturesQuery)
        {
            var bitmap = await LoadImage(pictureFile);
            var img = new Image { Source = bitmap };
            ImagesGridView.Items.Add(img);
        }
    }

崩溃不是在加载图像时发生,而是在加载成功后,应用程序应该在 GridView 中显示图像。此外,我使用相同图像的副本来确保所有图像都是相同的。

对我来说,在应用程序中加载大图像似乎很常见,所以也许我在这里做错了什么?

【问题讨论】:

    标签: c# xaml gridview windows-runtime


    【解决方案1】:

    虽然您的图像控件只有 320x180,但您正在以全分辨率加载图像,因此您尝试将 3264x2448x4(每像素字节数)x13 =~400MB 的纹理输入到您的视频卡中,这可能有点牵强。

    尝试使用StorageFile.GetThumbnailAsync() 加载图片,例如。

    private static async Task<BitmapImage> LoadImageAsync(StorageFile pictureFile)
    {
        using (var stream = await pictureFile.GetThumbnailAsync(
            ThumbnailMode.SingleItem,
            320,
            ThumbnailOptions.ResizeThumbnail))
        {
            var bitmap = new BitmapImage();
            await bitmap.SetSourceAsync(stream);
            return bitmap;
        }
    }
    

    【讨论】:

    • 谢谢,我会将其标记为答案,但是当您在这里时 - 我有一个相关问题:来自网络的图像呢?我只是在本地图像上进行测试,但最终我需要从网络上获取大图像(可能没有那么大,但数量更多),我无法获得它们的缩略图(我猜),我应该下载大图像然后调整它的大小手动网格并将原件保存在内存中?因为下载它们两次(用于网格和图像放大)似乎浪费带宽。
    • 这是一个单独的问题,它有很多答案,具体取决于您的情况。 1. 您应该从网络上获取大量图像的缩略图。 2. 您可以获得完整版本,将它们保存在本地,然后从中加载缩略图(GetThumbnailAsync() 将为您生成一个新的缩略图)。 3. 您可以对下载的文件使用一些缓存 - 依赖于 Web 堆栈或构建您自己的缓存。 4. 你应该确保你的列表控件默认使用虚拟化来显示它,但是如果你改变ItemsPanel模板可以停止。
    猜你喜欢
    • 1970-01-01
    • 2021-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多