Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 在listbox中,以编程方式进行的多重选择更新速度较慢_Wpf_Listbox_Selection - Fatal编程技术网

Wpf 在listbox中,以编程方式进行的多重选择更新速度较慢

Wpf 在listbox中,以编程方式进行的多重选择更新速度较慢,wpf,listbox,selection,Wpf,Listbox,Selection,我尝试使用扩展选择模式以编程方式更新列表框中的选定项我是这样做的: foreach (var selectedItem in ItemsForSelection) { _myList.SelectedItems.Add(selectedItem); } 我的问题是,当所选项目的数量很大时,更新速度非常慢 问题的根源在于listbox不能从MultiSelector派生,可以通过使用BeginUpdateSelectedItems和EndUpdateSelectedItems方法对Multi

我尝试使用扩展选择模式以编程方式更新列表框中的选定项
我是这样做的:

foreach (var selectedItem in ItemsForSelection)
{
  _myList.SelectedItems.Add(selectedItem);
}
我的问题是,当所选项目的数量很大时,更新速度非常慢
问题的根源在于listbox不能从MultiSelector派生,可以通过使用BeginUpdateSelectedItems和EndUpdateSelectedItems方法对MultiSelector进行调整以执行快速批量更新

有没有办法在列表框中获得类似的结果?

列表框中是否有可用的
BeginUpdate
EndUpdate
方法

_myList.BeginUpdate(); foreach (var selectedItem in ItemsForSelection) { _myList.SelectedItems.Add(selectedItem); } _myList.EndUpdate(); _myList.BeginUpdate(); foreach(ItemsForSelection中的var selectedItem) { _myList.SelectedItems.Add(selectedItem); } _myList.EndUpdate();
这是假设
\u myList
是一个列表框…开始/结束更新方法对冻结WM\u PAINT消息并分别解冻,从而使其不闪烁且快速。

添加一块项目后,尝试通过将调度程序帧推到调度程序中来泵送调度程序


您可以使用列表框中的SetSelectedItems(IEnumerable)。此函数将选择更改包装在SelectionChange.Begin/End(不幸的是,它只在内部可用)中,这应该只会导致一个选择更改事件发生


请注意,SetSelectedItems是受保护的,因此您必须使用自己的ListBox派生函数来调用它。奇怪的选择。

如果我有这些方法,我不会问这个问题。我也不认为这与WM_PAINT有什么关系-缓慢是许多引发的ListChanged事件和缓慢的listbox内部逻辑造成的。@Andy:公平地说,它存在于WinForms下,它完成了工作,如果你向listbox添加了大量的项,这就是为什么它看起来既快又快的原因。我不确定WPF,除非组件不同。WinForms ListView有这样的功能,这是肯定的,同样,如果在WPF中有,也不是100%有把握…为什么不在添加到列表之前先临时删除事件处理程序,然后在添加完成后再重新添加它们?这会有什么帮助?我假设我需要阻止每当选择每个项目时执行的内部列表框逻辑,即我需要阻止对SelectedItems列表中的每个更改执行ListChanged事件处理。这实际上可能会加快速度,因为每个操作都将以增量方式处理,而不是用户界面挂起或出现这样,当您添加项目的选择。完全重新选择的端到端时间很可能会更长,但用户不会这样想——他们会看到应用程序工作。呸..我刚刚测试过,虽然它确实包装了选择更改,但它仍然会在新选择集中为每个项目触发一个添加事件。即使事件支持范围,它们也会一次执行一个范围。真是蹩脚。我的解决方法是将base.SetSelectedItems中的调用包装在我自己的begin/end中,临时挂起我的处理程序以进行更改通知,并在新集合就位后恢复它,正在重置我的本地可观察集合。很抱歉,我9年前为此编写的代码被锁定在前一位雇主的私人回购协议中的保密协议后面。