.NET 6中WinForms ListView无法显示图片问题求助
.NET 6中ListView Detail视图无法显示图片的问题
使用ListView在Detail视图显示图片的示例代码,在.NET Framework 4.7.2环境下可正常运行,但切换到.NET 6.0 (LTS)环境后,图片无法显示。确认是.NET版本差异导致的问题,询问是否遗漏了必要配置。
相关代码
public partial class Form1 : Form { List<string> _list = new(); ImageList serviceLogoList = new ImageList { ImageSize = new Size(32, 32), ColorDepth = ColorDepth.Depth32Bit }; public Form1() { InitializeComponent(); initializeListView(); DirectoryInfo dir = new DirectoryInfo(@"resources"); // 替换为你的图片文件夹路径 foreach (FileInfo file in dir.GetFiles()) { try { this.serviceLogoList.Images.Add(Image.FromFile(file.FullName)); } catch { // 记录加载错误 } } foreach (var str in _list) { ListViewItem item = new ListViewItem(); item.Text = str; item.SubItems.Add("OK"); item.ImageIndex = 0; // 尝试过1、2等索引仍无效 listView1.Items.Add(item); } } private void initializeListView() { _list.Add("Test1"); _list.Add("Test2"); _list.Add("Test3"); listView1.View = View.Details; // listView1.LargeImageList = serviceLogoList; listView1.SmallImageList = serviceLogoList; listView1.Columns.Add("Name", 100); listView1.Columns.Add("Status", 100); } }
环境差异说明
- 在「Windows Forms App (.NET Framework)」项目中,上述代码可正常显示图片:
.NET Framework运行效果 - 在「Windows Forms App (.NET 6)」项目中,图片无法显示:
.NET 6运行效果
项目仅需在窗体中添加名为listView1的ListView控件,其余逻辑均在代码后置文件中实现。
问题原因及解决方案
在.NET 6及以上版本的Windows Forms中,ImageList关联到ListView后再添加图片,控件不会自动触发图片更新;而.NET Framework中存在隐式的同步机制,因此可以正常工作。
修正方法:调整代码执行顺序,先完成ImageList的图片加载,再将其赋值给ListView的SmallImageList:
修正后的代码
public partial class Form1 : Form { List<string> _list = new(); ImageList serviceLogoList = new ImageList { ImageSize = new Size(32, 32), ColorDepth = ColorDepth.Depth32Bit }; public Form1() { InitializeComponent(); initializeListView(); // 1. 先加载所有图片到ImageList DirectoryInfo dir = new DirectoryInfo(@"resources"); foreach (FileInfo file in dir.GetFiles()) { try { this.serviceLogoList.Images.Add(Image.FromFile(file.FullName)); } catch { // 记录加载错误 } } // 2. 再将ImageList赋值给ListView listView1.SmallImageList = serviceLogoList; // 3. 添加ListView项 foreach (var str in _list) { ListViewItem item = new ListViewItem(); item.Text = str; item.SubItems.Add("OK"); item.ImageIndex = 0; listView1.Items.Add(item); } } private void initializeListView() { _list.Add("Test1"); _list.Add("Test2"); _list.Add("Test3"); listView1.View = View.Details; // 移除此处的SmallImageList赋值 listView1.Columns.Add("Name", 100); listView1.Columns.Add("Status", 100); } }
此外,还需确保:
resources文件夹路径正确,且包含可正常加载的图片文件- 图片索引
ImageIndex对应存在的图片(避免索引越界)
内容的提问来源于stack exchange,提问作者jeranio
相关产品推荐
相关产品推荐

