如何避免 WPF 列表框更新阻止按钮
本文关键字:按钮 更新 何避免 WPF 列表 | 更新日期: 2023-09-27 18:36:44
我有一个带有ListBox
的WPF窗口,它绑定到一个public ObservableCollection<String>
,该正在由另一个线程(BackGroudWorker
)更新。
<ListBox Name="ListBox"
ItemsSource="{Binding MyCollection}"
... />
在同一窗口中,我有一个带有单击处理程序的Button
:
<Button Content="Close"
Click="Button_LogWindow_closeButton_Click"
... />
当我在更新列表框时单击按钮时,通常不会调用此处理程序。尽管当后台线程完成并且ListBox
不再更新时,它可以完美运行。
在我看来,这就像在调用其处理程序之前从队列中删除了按钮单击事件。我说的对吗?
你知道怎么解决这个问题吗?
很难说没有看到你的代码,但你的 GUI 线程可能忙于在每次调用 ObservableCollection 的 Add 方法时更新 ListBox,以至于无法处理鼠标单击事件。
如果您的后台线程正在使用 Dispatcher.Invoke 或 Dispatcher.BeginInvoke 将项目添加到 ObservableCollection,则可以降低优先级(例如,降低到 Dispatcher.Background),以便为点击事件提供处理的机会。
还可以将 ObservableCollection 与 add range 方法一起使用,该方法仅针对项目集合而不是每个项目引发一次 INotifyCollectionChanged.CollectionChanged 事件。 请参阅此答案或Microsoft自己的 BulkObservableCollection 作为示例。
我发现了错误。每次更新窗口时,都会调用函数ListBox.Focus()
。这似乎是为了将窗口保持在最顶部位置。我已将 XAML 文件更改为:
<Window ...
Topmost="True"
... />
这应该是它应该的方式;-)