如何避免WPF ListBox更新阻止按钮?

时间:2016-02-29 08:58:41

标签: c# wpf multithreading listbox backgroundworker

我有一个带有ListBox的WPF窗口,该窗口绑定到public ObservableCollection<String>,由另一个线程(BackGroudWorker)更新。

<ListBox Name="ListBox" 
         ItemsSource="{Binding MyCollection}" 
         ... />

在同一个窗口中,我有一个Button点击处理程序:

<Button Content="Close"
        Click="Button_LogWindow_closeButton_Click"
        ... />

在更新ListBox时单击按钮时通常不会调用此处理程序。虽然它在后台线程完成并且ListBox不再更新时效果很好。

这让我觉得在调用处理程序之前,正在从队列中删除按钮单击事件。我是对的吗?

你知道如何解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

如果没有看到您的代码,很难说,但是您的GUI线程可能在每次调用ObservableCollection的Add方法时都忙于更新ListBox,而不会处理鼠标单击事件。

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

您还可以使用带有添加范围方法的ObservableCollection,该方法仅针对项目集合而不是针对每个项目引发INotifyCollectionChanged.CollectionChanged事件一次。请参阅this answer或Microsoft自己的BulkObservableCollection作为示例。

答案 1 :(得分:0)

我发现了错误。每次更新窗口时,都会调用函数class Foo: def test(self, arg): self._x = 'prop x with ' + arg 。这似乎是为了将窗户保持在最顶层位置。我已将XAML文件更改为:

ListBox.Focus()

这应该是它的意思; - )