好吧,在任何人开始之前,让我清楚...
我使用的是自定义控件,在本例中为Telerik的RadPane。对这些窗格进行反序列化时,它们是通过一种回调方法进入的,因此,它们全部由一个线程拥有/反序列化,因此无法对其进行克隆或深度复制等。因此,我尝试使用一些巨大的限制。这很不好,因为我想向每个窗格添加内容,但希望它们全部在其自己的UI线程范围内工作。例如,我想将一个列表添加到窗格中,并用数百万条记录等更新它,但是如果更新一个窗格,则UI线程将锁定所有窗格。
我需要在另一个线程中创建该对象的内容,但是问题是,当我尝试设置内容时,一个明显的问题是该对象不属于拥有我的窗格的同一线程:
myRadPane.Content = myGrid;
myGrid由与myRadPane不同的线程拥有,因此它不想设置内容。在WPF中是否有解决此问题的方法,还是允许一个对象在UI线程之间“共享”的方法?
编辑:请注意,我完全了解调度程序的工作方式,并且每当主UI线程需要为一个窗格更新时,我的应用程序就会使用它们。但是,在这种情况下,即使在尽可能少地使用调度程序的情况下,UI线程也会在繁重的负载下陷入困境。
您可以复制WPF控件。
在您的创建者线程中调用此命令:
public string CopyWPFControl<T>(T source)
{
string childXaml = XamlWriter.Save(source);
var stringReader = new StringReader(childXaml);
return stringReader.ToString();
}
将结果转移到分派器/ STA线程并调用:
public T RecreateWPFControl<T>(string source)
{
var xmlReader = XmlReader.Create(source);
var clonedChild = (T)XamlReader.Load(xmlReader);
return clonedChild;
}
因此,在“差异线程”中创建对象,然后复制Control及其所有Bindings并使用输出显示。
导入后,将仅复制XAML描述。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句