C# WP7将批量元素添加到我的场景中
我的WP7应用程序中有一个场景,包含大约250个带有自定义模板的复选框 这些复选框都是在后台线程上准备好的(datawise),并且都可以正常工作 但是,当我将它们添加到画布时,即使我使用Dispatcher,它似乎也会完全阻塞UI线程 是否有一种很好的方法可以批量添加它们,使它们几乎逐渐出现在场景中 这是我当前的实现C# WP7将批量元素添加到我的场景中,c#,silverlight,performance,windows-phone-7,C#,Silverlight,Performance,Windows Phone 7,我的WP7应用程序中有一个场景,包含大约250个带有自定义模板的复选框 这些复选框都是在后台线程上准备好的(datawise),并且都可以正常工作 但是,当我将它们添加到画布时,即使我使用Dispatcher,它似乎也会完全阻塞UI线程 是否有一种很好的方法可以批量添加它们,使它们几乎逐渐出现在场景中 这是我当前的实现 foreach (var cbData in container.ParamCheckBoxesToCreate) { C
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个,直到完成为止?我会:
如果您从后台线程驱动添加,则可以在调用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);
}
}
private void按钮\u单击(对象发送者,路由目标)
{
螺纹=新螺纹(ThreadProc);
thread.Start();
}
void ThreadProc()
{
对于(int i=0;i<2800;i++)
{
Dispatcher.BeginInvoke(()=>
{
int index=LayoutRoot.Children.Count;
矩形rect=新矩形()
{
宽度=10d,
高度=10d,
填充=新的SolidColorBrush(颜色为红色),
};
int行=索引/4;
整数列=10*(索引%70);
Canvas.SetTop(rect,col);
Canvas.SetLeft(rect,row);
LayoutRoot.Children.Add(rect);
});
睡眠(1);
}
}
好的,有几个问题,1。为什么?2.我需要复选框的绝对位置,因此需要Canvas.SetTop/Left