WP7将批量元素添加到我的场景中

时间:2011-04-05 01:30:22

标签: c# silverlight performance windows-phone-7

我的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个,直到我完成?

2 个答案:

答案 0 :(得分:1)

我会:

  1. 使用网格而非画布作为父容器
  2. 向容器(可能是堆栈面板)添加一批复选框
  3. 将容器添加到网格
  4. 中为容器设置动画
  5. 从步骤2开始重复

答案 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);                
    }
}