0

我正在努力找出将图标加载到View.LargeIcon已使用文件列表初始化的 ListView (in) 中的最佳方法。

我想我将不得不使用一个 ImageList,所以我创建了一个并将其分配给 ListView。我创建了一个 BackgroundWorker 来处理从每个图像加载图标的繁琐工作。

  1. DoWork我使用InvokeRequired和的组合Invoke将项目添加到 ListView。这行得通,但它导致 UI 闪烁了一下,看起来并不是特别好。无法ListView.Items从工作线程内循环意味着必须将 aList<ListViewItem>作为参数传递。即使我在循环中调用CancelAsync并检查CancellationPending并退出如果它是真的,我也很难让 BackgroundWorker 取消。(此时为什么会发生这种情况并不重要。)

  2. 我尝试使用该ProgressChanged事件来处理所有 UI 工作。我调用ReportProgress(0, obj)whereobj是一个自定义类,其中包含我希望 UI 线程用来更新 UI(即 ListView)的信息片段。这种方法似乎更有希望。

然而,这两种解决方案对我来说都不是特别优雅,也没有带来特别好的用户体验。我觉得我错过了这个问题的(明显的)解决方案。毕竟,Windows 资源管理器处理图像缩略图的加载比我的应用程序要好得多。不过,我相信 Windows 资源管理器会在 Thumbs.db 中缓存缩略图。

也许上述两种方法中的一种正确的方法,如果是这种情况,请告诉我,以便我可以更详细地调查该特定解决方案,以找出我做错了什么。

编辑

我忘了提到文件和图标列表是从网络路径加载的。

4

1 回答 1

1

我建议将您的业务逻辑与您的 UI 逻辑分离。加载文件列表并为其获取图标的代码不应与与ListView表单上的控件一起使用的代码混合。

例如,我建议创建一个简单地包含每个文件所需的所有数据属性的类:

class MyFileInfo
{
    public string FileName { get; set; }
    public Image Icon { get; set; }
}

然后,编写一个返回已填充对象列表的方法:

public List<MyFileInfo> LoadFileList(string folderPath) { }

然后,UI 可以在另一个线程上调用该方法,当它返回结果时,它可以ListView从返回的数据中填充控件。要在添加或修改项目时停止列表闪烁,请在进行任何更改之前调用控件SuspentLayout上的方法ListView,然后ResumeLayout在完成所有更改后调用。

于 2012-07-11T15:18:01.400 回答