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

WPF ListView运行时加载下载图片失败问题求助

问题分析与解决方案

核心问题

  1. UI元素无法复用:你把创建的Image控件添加到了pic Canvas中,WPF里一个UI元素只能属于一个视觉树,因此这个Image没法同时在ListView的单元格里显示。
  2. 绑定类型不匹配:你的CarListItem的Logo属性是Image控件类型,但ListView单元格模板里的<Image Source="{Binding Logo}"/>需要的是ImageSource(比如BitmapSource)类型,不是UI控件本身。

修改步骤

1. 调整数据模型类型

把CarListItem的Logo属性改为BitmapSource(或基类ImageSource):

public class CarListItem
{
    public BitmapSource Logo { get; set; }
    public string Name { get; set; }
    public string Land { get; set; }
    public string Region { get; set; }
}

2. 修改图片加载逻辑

让LoadFlag返回BitmapSource而非Image控件,若要保留Canvas测试展示,单独创建Image添加:

private async void LoadFlags(RootAutomarken automarken)
{
    var client = new HttpClient();
    foreach (var item in automarken.Automarken)
    {
        var flagSource = await LoadFlag(item.Land, client);
        mainList.Items.Add(new CarListItem 
        { 
            Logo = flagSource, 
            Name = item.Name, 
            Land = item.Land, 
            Region = item.Region
        });
    }
}

private async Task<BitmapSource> LoadFlag(string countrycode, HttpClient client)
{
    var request = new HttpRequestMessage
    {
        Method = HttpMethod.Get,
        RequestUri = new Uri("https://www.countryflagsapi.com/png/" + countrycode),
    };
    using (var response = await client.SendAsync(request))
    {
        response.EnsureSuccessStatusCode();
        Stream imageStreamSource = await response.Content.ReadAsStreamAsync();
        PngBitmapDecoder decoder = new PngBitmapDecoder(
            imageStreamSource, 
            BitmapCreateOptions.PreservePixelFormat, 
            BitmapCacheOption.Default);
        BitmapSource bitmapSource = decoder.Frames[0];

        // 保留Canvas测试代码(可选)
        Image testImage = new Image();
        testImage.Source = bitmapSource;
        testImage.Stretch = Stretch.Uniform;
        testImage.Height = 15;
        testImage.Width = 15;
        testImage.Margin = new Thickness(20);
        pic.Children.Add(testImage);

        return bitmapSource;
    }
}

3. XAML无需修改

原单元格模板已正确绑定Source属性,现在绑定的Logo是BitmapSource类型,符合要求:

<GridViewColumn Header="Logo" Width="50">
    <GridViewColumn.CellTemplate>
        <DataTemplate>
            <Image Source="{Binding Logo}"/>
        </DataTemplate>
    </GridViewColumn.CellTemplate>
</GridViewColumn>

额外说明

  • WPF中要遵循绑定数据而非绑定UI控件的原则,既能避免视觉树冲突,也更符合常规设计逻辑。
  • 如果不需要Canvas的测试展示,可直接删除创建testImage并添加到pic的代码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 08:40:27