【发布时间】:2012-05-07 07:09:20
【问题描述】:
我正在尝试使用 Microsoft.Windows.APICodePack.Shell.ShellContainer 作为 ListBox 的 ItemsSource,通过 ListBox.ItemTemplate 显示每个孩子的 (ShellObject) 缩略图和名称。 当 ShellContainer 引用一个非常大的文件夹(比如一千多个文件)时,就会出现问题:如果我只是声明
ShellContainer source=ShellObject.FromParsingName(@"C:\MyFolder") as ShellContainer:
listBox1.ItemsSource=source.GetEnumerator();
它将 UI 冻结两三分钟,然后立即显示 ShellContainer 的所有内容。 我发现最好的解决方法是创建一个像这样的异步填充类
class AsyncSourceFiller
{
private ObservableCollection<ShellObject> source;
private ShellContainer path;
private Control parent;
private ShellObject item;
public AsyncSourceFiller(ObservableCollection<ShellObject> source, ShellContainer path, Control parent)
{
this.source = source;
this.path = path;
this.parent = parent;
}
public void Fill()
{
foreach (ShellObject obj in path)
{
item = obj;
parent.Dispatcher.Invoke(new Action(Add));
Thread.Sleep(4);
}
}
private void Add()
{
source.Add(item);
}
}
然后通过调用它
ObservableCollection<ShellObject> source = new ObservableCollection<ShellObject>();
listBox1.ItemsSource = source;
ShellContainer path = ShellObject.FromParsingName(@"C:\MyFolder"):
AsyncSourceFiller filler = new AsyncSourceFiller(source, path, this);
Thread th = new Thread(filler.Fill);
th.IsBackground = true;
th.Start();
这比以前的方式花费更多时间,但不会冻结 UI 并立即开始显示一些内容。 有没有更好的方法来获得类似的行为,可能会缩短总操作时间?
【问题讨论】:
标签: c# wpf listbox windows-api-code-pack