XamlReader.Parse()与BackgroundWorker线程的工作方式不同吗?

时间:2012-05-09 13:06:47

标签: wpf xaml

我正从数据库中检索xaml字符串并构建xaml画布。

电话

 loadedCanvas = (Canvas)System.Windows.Markup.XamlReader.Parse(xamlTemplate);

从UI线程正常工作。当我尝试从BackgroundWorker线程做同样的事情时,我得到一个XamlParseException,消息“无法创建未知类型Canvas”指向第一个Canvas标记。

两种情况下的xaml都是相同的。

我觉得我错过了一些非常明显的东西。

1 个答案:

答案 0 :(得分:3)

我不确定您为什么会收到特定的错误消息(这是误导性的),但是您无法从非UI线程加载XAML;即使你可以,你也可能无法在UI线程中使用它们,因为WPF控件具有线程关联性。

您无法从非UI加载(技术上限制是“非STA线程”)的原因是UI元素要求当前线程为STA以用于编组目的,如果您当前正在为该效果抛出异常在MTA线程内。 BackgroundWorker使用的托管线程池只有MTA线程。

TL; DR:您需要在UI线程中执行此操作。