有没有办法采用创建UI元素并使其可取消的方法?

时间:2011-03-16 21:59:16

标签: multithreading windows-phone-7 grid rendering

我在WP7应用程序中输入图表页面时会调用一个方法。它生成一个对象列表并填充一个ListBox。每个ListBoxItem的内容是一个包含10列数据的Grid。无法快速生成列表,即使有1000-2000项。但是一旦该方法开始构建网格并将它们添加到ListBox,它就会变得相对慢得多。现在,通过这个我的意思是它只将设备占用了我的第二代同类应用程序的一半。 iPod Touch。因此性能很好 - 只要用户想要数据图表。

如果用户点击“开始”按钮,则应用会退出,这样就不会出现问题。我担心的是当用户退回到上一页时。该应用程序只是等待该方法运行。我注意到更多主流应用程序中的类似行为,如Kindle应用程序。但我对MarketPlace商店没有这种影响力!我有一个继续运行的进度条,所以行为是一样的。

出于对被MarketPlace拒绝的担心,我尝试将该方法放入BackgroundWorker流程但是失败了,因为它是在创建瓶子所在的UI元素并且在UI线程上运行,因此我得到了访问错误。有没有办法采用创建UI元素的方法,例如Grid,并使其可以取消?

2 个答案:

答案 0 :(得分:2)

您应该使用BackgroundWorker。当您需要更新UI时,请使用以下代码...

Dispatcher.BeginInvoke(() =>
{
   textBlock.Text = "some text";
   etc
   etc
}

答案 1 :(得分:2)

您是否在代码中手动创建每个ListBoxItem内的UI元素?如果是这样,你会发现通过使用数据绑定来提高性能,因为ListBox使用VirtualizingStackPanel作为项容器,所以它只会实际创建UI元素,以便能够看到足够的元素并立即滚动到。用户开始滚动时会创建其他元素。适用于Windows Phone性能团队的Silverlight在ListBox Performance上发布了一篇很棒的帖子。

如果数据集特别大,您可以通过使用数据虚拟化(或替代)找到进一步的性能改进,正如Peter Torr在他的Virtualizing Data in Windows Phone 7帖子中解释的那样。