【发布时间】:2015-03-05 14:52:45
【问题描述】:
我正在开发一个应用程序,我正在使用 BackgroundWorker 从 RunWorkerCompleted 方法将项目添加到列表视图。从 RunWorkerCompleted 方法中,我添加了 ListViewItems,我在其中设置了 .Content 和 .Background。
但是,在设置 .Background 属性并调用 ListView 类的 .UpdateLayout() 方法时,我遇到了一个异常:“不能使用属于与其父 Freezable 不同的线程的 DependencyObject。”。
private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
try
{
if (e.Cancelled == true)
{
System.Windows.MessageBox.Show("Something..cancelled");
}
else if (e.Error != null)
{
System.Windows.MessageBox.Show("Something..error " + e.Error.Message);
}
else
{
workLoad_listView.Items.Clear();
workLoad_listView.Height = 23;
foreach (Workload.workload element in Workload.Get())
{
System.Windows.Controls.ListViewItem item = new System.Windows.Controls.ListViewItem();
item.Content = (string)element.name;
item.Background = element.brush; // if I outcomment this line, no exception is thrown!
workLoad_listView.Items.Add(item);
}
workLoad_listView.UpdateLayout(); //exception is thrown here!
while (FindVisualChild<ScrollViewer>(workLoad_listView).ComputedVerticalScrollBarVisibility == Visibility.Visible)
{
workLoad_listView.Height += 1;
workLoad_listView.UpdateLayout();
}
}
}
catch (Exception ex)
{
System.Windows.MessageBox.Show(string.Format("An exception was thrown!\n{0}", ex), "Exception caught", MessageBoxButton.OK, MessageBoxImage.Error);
}
}
这是工作负载类:
public static class Workload
{
public struct workload
{
public string name;
public System.Windows.Media.SolidColorBrush brush;
}
private static List<workload> workload_list = new List<workload>();
public static void Add(string name, int colorNumber)
{
workload tmp_workload = new workload();
tmp_workload.name = name;
System.Drawing.Color color = System.Drawing.ColorTranslator.FromWin32(colorNumber);
tmp_workload.brush = new System.Windows.Media.SolidColorBrush(System.Windows.Media.Color.FromArgb(255, (byte)color.R, (byte)color.G, (byte)color.B));
workload_list.Add(tmp_workload);
}
public static void Clear()
{
workload_list.Clear();
}
public static List<workload> Get()
{
return workload_list;
}
}
任何建议将不胜感激:)
最好的问候。
【问题讨论】:
标签: c# wpf listview exception backgroundworker