我有一个带有ListBox
的WPF窗口,该窗口绑定到public ObservableCollection<String>
,由另一个线程(BackGroudWorker
)更新。
<ListBox Name="ListBox"
ItemsSource="{Binding MyCollection}"
... />
在同一个窗口中,我有一个Button
点击处理程序:
<Button Content="Close"
Click="Button_LogWindow_closeButton_Click"
... />
在更新ListBox时单击按钮时通常不会调用此处理程序。虽然它在后台线程完成并且ListBox
不再更新时效果很好。
这让我觉得在调用处理程序之前,正在从队列中删除按钮单击事件。我是对的吗?
你知道如何解决这个问题吗?
答案 0 :(得分:1)
如果没有看到您的代码,很难说,但是您的GUI线程可能在每次调用ObservableCollection的Add方法时都忙于更新ListBox,而不会处理鼠标单击事件。
如果您的后台线程正在使用Dispatcher.Invoke或Dispatcher.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()
这应该是它的意思; - )