0

ListViewItem 有问题。当我在线程中使用它时,它会显示一条消息:

“调用线程必须是 STA,因为很多 UI 组件都需要这个。”

然后我将其更改为:

Mythread.SetApartmentState(ApartmentState.STA);

虽然当我使用它时,它再次显示一条消息:

“调用线程无法访问此对象,因为不同的线程拥有它。”

我使用 Dispatcher。它再次显示一条消息:

“调用线程无法访问此对象,因为不同的线程拥有它。”

我在做什么来解决问题?

Thread th = new Thread(() =>
    {                                          
        search.SearchContentGroup3(t, addressSearch.CurrentGroup.idGroup);
    });
th.SetApartmentState(ApartmentState.STA);
th.Start();


public void SearchContentGroup3(int id)
{
    ListViewItem lst = new ListViewItem();
    lst.DataContext = p;        
    Application.Current.Dispatcher.BeginInvoke(
        new Action(() => currentListView.Items.Add(lst)),
        DispatcherPriority.Background);
}
4

1 回答 1

1

如果我理解正确,您想启动一个工作线程来加载某种实体,然后创建一个列表视图项来表示它。

我的猜测是问题在于您正在线程中创建列表视图项,并尝试使用 Dispatcher 将其附加到列表视图。相反,试试这个:

public void SearchContentGroup3(int id)
{
// Do stuff to load item (p?) 
// ...

// Signal the UI thread to create and attach the ListViewItem. (UI element)
Application.Current.Dispatcher.BeginInvoke(
    new Action(() => 
    {
       var listItem = new ListViewItem() {DataContext = p};
       currentListView.Items.Add(lst); 
    }),
    DispatcherPriority.Background);
}
于 2012-09-16T23:09:34.440 回答