我的WP7应用程序中有一个场景,大约有250个自定义模板复选框。
复选框都在后台线程上准备好(数据方式),并且一切正常。
但是当我将它们添加到Canvas时,即使我使用Dispatcher,它似乎完全陷入了UI线程。
有没有一种很好的方法可以批量添加它们,以便它们几乎逐渐出现在场景中?
这是我目前的实施
foreach (var cbData in container.ParamCheckBoxesToCreate)
{
CheckBox cb = new CheckBox
{
Template = (ControlTemplate)Resources[cbData.CB_TemplateName],
//more creation stuff
};
Canvas.SetLeft(cb, cbData.CB_Left);
Canvas.SetTop(cb, cbData.CB_Top);
Canvas.SetZIndex(cb, 30);
Dispatcher.BeginInvoke(new Action(() => MyCanvas.Children.Add(cb)));
}
但是添加其中250个仍会杀死UI线程。
如何添加,一次说10个,直到我完成?
答案 0 :(得分:1)
我会:
答案 1 :(得分:0)
如果你驱动从后台线程添加它,你可以在调用Dispatcher之间的后台线程上添加对Thread.Sleep(1)的调用,以便让UI线程处理你的工作项。这是一个简化的例子,在画布上添加矩形:
private void Button_Click(object sender, RoutedEventArgs e)
{
Thread thread = new Thread(ThreadProc);
thread.Start();
}
void ThreadProc()
{
for (int i = 0; i < 2800; i++)
{
Dispatcher.BeginInvoke(() =>
{
int index = LayoutRoot.Children.Count;
Rectangle rect = new Rectangle()
{
Width = 10d,
Height = 10d,
Fill = new SolidColorBrush(Colors.Red),
};
int row = index / 4;
int col = 10*(index % 70);
Canvas.SetTop(rect, col);
Canvas.SetLeft(rect, row);
LayoutRoot.Children.Add(rect);
});
Thread.Sleep(1);
}
}