Silverlight背景螺纹测量高度

时间:2009-11-10 19:53:00

标签: silverlight

Thread MeasureThread = new Thread(delegate()
{
  TextBlock tb = new TextBlock();
});
MeasureThread.Start();

这会抛出无效的跨线程访问异常,即使此特定TextBlock永远不会添加到可视树中。我意识到我可能用Dispatcher.BeginInvoke包装它,但这似乎打败了使用后台线程的点。我想使用这个文本框来计算1000多个不同文本的某些文本的高度。我希望能够在后台线程中进行此计算。

1 个答案:

答案 0 :(得分:1)

不幸的是你不能这样做。对UIElements的所有更改必须在UI线程上进行,无论任何特定元素是否实际位于可视树中。

我认为你不想在UI线程上放置这个逻辑的原因是它会导致UI在计算完成时锁定。解决这个问题的一种方法是做你的建议;使用Dispatcher.BeginInvoke。而不是仅仅调用1000+ TextBlocks的计算,您可以调用单个TextBlock的计算,然后在完成时调用下一个,依此类推。您还可以使用DispatcherTimer来安排事情发生的时间。通过这种方式,您可以分解单个大型计算,以便UI永远不会完全冻结;当然,计算完成需要更长的时间,但是你可以在不长时间锁定UI线程的情况下完成。