C# WinForms - ListViewItem 图像未显示

C# WinForms - ListViewItem image not showing

我有一个相当小的问题,即每个 ListViewItem 的图像都没有显示。每个服务名称旁边应该有一个图像,但是 none 出现了。 Application.EnableVisualStyles(); 已开启。我尝试将资源图像设置为 PictureBox 作为测试,并且工作正常。设计器中添加了两列 headers。为每个项目正确设置索引,还尝试分配 ImageKey.

已经在此处阅读了多个类似的问题,但none解决了这个问题。

加载时完成 ImageList 的初始化

    ImageList serviceLogoList = new ImageList
    {
        ImageSize = new Size(32, 32),
        ColorDepth = ColorDepth.Depth32Bit
    };

    serviceLogoList.Images.Add(Properties.Resources.drive_logo);
    serviceLogoList.Images.Add(Properties.Resources.dropbox_logo);
    serviceLogoList.Images.Add(Properties.Resources.seeyou_logo);

    listViewDisablableItemsServices.View = View.Details;
    listViewDisablableItemsServices.LargeImageList = serviceLogoList;
    listViewDisablableItemsServices.SmallImageList = serviceLogoList;

将图像分配给每一行

foreach (var service in _services)
{
    if (service.ServiceType == Constants.SERVICE_TYPE_STORAGE)
    {
        ListViewItem item = new ListViewItem(service.Label);
        item.SubItems.Add(service.ErrorOrInterpretedError ?? Lang.GetString("Common_OK"));
        item.Tag = service;

        switch (service.ServiceName)
        {
            case "google":
                item.ImageIndex = 0;
                break;
            case "dropbox":
                item.ImageIndex = 1;
                break;
            case "seeyou":
                item.ImageIndex = 2;
                break;
        }

        listViewDisablableItemsServices.Items.Add(item);

        if (!service.IsAuthenticatedAndAvailable)
        {
            listViewDisablableItemsServices.DisableItem(item);
        }
    }
}

图像应显示的位置

我尝试创建一个类似的 winform 项目并且它有效。

我的示例代码:

ImageList serviceLogoList = new ImageList
{
    ImageSize = new Size(32, 32),
    ColorDepth = ColorDepth.Depth32Bit
};

serviceLogoList.Images.Add(Properties.Resources.p1);
serviceLogoList.Images.Add(Properties.Resources.p2);

listViewDisablableItemsServices.View = View.Details;
listViewDisablableItemsServices.LargeImageList = serviceLogoList;
listViewDisablableItemsServices.SmallImageList = serviceLogoList;


ListViewItem item1 = new ListViewItem("test1");
item1.ImageIndex = 0;
item1.SubItems.Add("XD1");

ListViewItem item2 = new ListViewItem("test2");
item2.ImageIndex = 1;
item2.SubItems.Add("XD2");

listViewDisablableItemsServices.Items.Add(item1);
listViewDisablableItemsServices.Items.Add(item2);

我想你的switch没有输入设置ImageIndex。您可以添加 Debug 来检查 ImageIndex 是否已设置。

我认为您缺少添加列

listViewDisablableItemsServices.Columns.Add("Name",100);
listViewDisablableItemsServices.Columns.Add("Status",100);

我正在发布基于您示例的工作代码

namespace WindowsFormsApp1
{
public partial class Form1 : Form
{
    List<StorageService> _services = new List<StorageService>();
    public Form1()
    {
        InitializeComponent();
        initializeListView();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        LoadServices();
        listViewDisablableItemsServices.Columns.Add("Name",100);
        listViewDisablableItemsServices.Columns.Add("Status",100);
        foreach (var service in _services)
        {
            if (service.ServiceType == Constants.SERVICE_TYPE_STORAGE)
            {
                ListViewItem item = new ListViewItem(service.Label);
                
                item.SubItems.Add(service.ErrorOrInterpretedError ?? Lang.GetString("Common_OK"));
                item.Tag = service;

                switch (service.ServiceName)
                {
                    case "google":
                        item.ImageIndex = 0;
                        break;
                    case "dropbox":
                        item.ImageIndex = 1;
                        break;
                    case "seeyou":
                        item.ImageIndex = 2;
                        break;
                }

                listViewDisablableItemsServices.Items.Add(item);

                if (!service.IsAuthenticatedAndAvailable)
                {
                    //listViewDisablableItemsServices.DisableItem(item);
                }
            }
        }
    }

    private void LoadServices()
    {
        _services.Add(new StorageService
        {
            ServiceType = "Storage",
            Label = "Google",
            ServiceName = "google",
            IsAuthenticatedAndAvailable = false,
            ErrorOrInterpretedError = "Sign up required"
        });
        _services.Add(new StorageService
        {
            ServiceType = "Storage",
            Label = "Drop box",
            ServiceName = "dropbox",
            IsAuthenticatedAndAvailable = true
        });
        _services.Add(new StorageService
        {
            ServiceType = "Storage",
            Label = "See You",
            ServiceName = "seeyou",
            IsAuthenticatedAndAvailable = true
        });
    }

    private void initializeListView()
    {
        ImageList serviceLogoList = new ImageList
        {
            ImageSize = new Size(32, 32),
            ColorDepth = ColorDepth.Depth32Bit
        };

        serviceLogoList.Images.Add(Properties.Resources.drive_logo);
        serviceLogoList.Images.Add(Properties.Resources.dropbox_logo);
        serviceLogoList.Images.Add(Properties.Resources.seeyou_logo);

        listViewDisablableItemsServices.View = View.Details;
        listViewDisablableItemsServices.LargeImageList = serviceLogoList;
        listViewDisablableItemsServices.SmallImageList = serviceLogoList;
    }
}

class StorageService
{
    public string ServiceType { get; set; }

    public string ServiceName { get; set; }

    public string Label { get; set; }

    public string ErrorOrInterpretedError { get; set; }

    public bool IsAuthenticatedAndAvailable { get; set; }
}

class Constants
{
    public const string SERVICE_TYPE_STORAGE = "Storage";
}

class Lang
{
    public static string GetString(string key)
    {
        return "OK";
    }
}
}

删除然后 re-adding 我的原始代码中的 ListView 组件解决了这个问题。 Visual Studio 也已在 re-adding 之后重新启动。