我刚刚为我的应用程序引入了加载动画。代码运行,但是当我与应用程序接口时,它崩溃时出现错误“必须在与DependencyObject相同的线程上创建DependencySource。”
我修改了代码,以便只检索&进程数据应该在后台线程上,并且在UI线程之后初始化任何类型的ObservableCollections。
然而,错误仍然被抛出!如果我只让后台工作程序处理'RetrieveItems'方法,那么它的行为,但大多数处理是在'ApplyFilters'方法中完成的 - 这是非常广泛的,但最终会返回一个IItemGroupViewModel列表。在这里可能会做什么样的事情干扰UI? 我相信它正在显示问题的ItemGroups - 尽管组列表正确返回并且在UI线程上可见。我还可以查看初始选项卡,它包含在RetrieveItems方法中创建的ItemViewModel。
我发现这也无法调试。
以下是代码:
public void Start()
{
var bgw = new BackgroundWorker();
bgw.DoWork += bgw_DoWork;
bgw.RunWorkerCompleted += bgw_RunWorkerCompleted;
_tabList = GenerateTabs();
DisplayLoadingScreen = true;
bgw.RunWorkerAsync();
}
private void bgw_DoWork(object sender, DoWorkEventArgs e)
{
var itemVMs = RetrieveItems(_pciSelectionViewModel.SelectedPcis);
var itemGroups = ApplyFilters(
_pciSelectionViewModel.SelectedPcis, itemVMs,
_pciSelectionViewModel.UserQuestionList, _tabList);
e.Result = Tuple.Create<IEnumerable<IItemViewModel>, IEnumerable<IItemGroupViewModel>>(itemVMs, itemGroups);
}
private void bgw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
DisplayLoadingScreen = false;
var res = e.Result as Tuple<IEnumerable<IItemViewModel>, IEnumerable<IItemGroupViewModel>>;
InitialiseObservableCollections(res.Item1, res.Item2);
}
public void InitialiseObservableCollections(IEnumerable<IItemViewModel> itemVMs,
IEnumerable<IItemGroupViewModel> itemGroups)
{
AddAllocatedTabsToItems(itemGroups);
ItemGroupCollection = new ObservableCollection<IItemGroupViewModel>(itemGroups);
PciCollection = new ObservableCollection<IPciViewModel>(_pciSelectionViewModel.SelectedPcis);
TabList = new ObservableCollection<IAnalysisTabViewModel>(_tabList);
ItemCollection = new ObservableCollection<IItemViewModel>(itemVMs);
AssignedTabFiltersCollection = new ObservableCollection<string>(GenerateItemTypeFilters(_tabList));
foreach (var itemGroup in itemGroups)
{
itemGroup.PopulateInternalData(_pciSelectionViewModel.SelectedPcis);
}
_tabList.ToList().ForEach(t => t.Update());
}