如何避免 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不再更新时,它可以完美运行。

在我看来,这就像在调用其处理程序之前从队列中删除了按钮单击事件。我说的对吗?

你知道怎么解决这个问题吗?

如何避免 WPF 列表框更新阻止按钮

很难说没有看到你的代码,但你的 GUI 线程可能忙于在每次调用 ObservableCollection 的 Add 方法时更新 ListBox,以至于无法处理鼠标单击事件。

如果您的后台线程正在使用 Dispatcher.Invoke 或 Dispatcher.BeginInvoke 将项目添加到 ObservableCollection,则可以降低优先级(例如,降低到 Dispatcher.Background),以便为点击事件提供处理的机会。

还可以将 ObservableCollection 与 add range 方法一起使用,该方法仅针对项目集合而不是每个项目引发一次 INotifyCollectionChanged.CollectionChanged 事件。 请参阅此答案或Microsoft自己的 BulkObservableCollection 作为示例。

我发现了错误。每次更新窗口时,都会调用函数ListBox.Focus()。这似乎是为了将窗口保持在最顶部位置。我已将 XAML 文件更改为:

<Window ...
    Topmost="True" 
    ... />

这应该是它应该的方式;-)