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

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

我的WP7应用程序中有一个场景,包含大约250个带有自定义模板的复选框

这些复选框都是在后台线程上准备好的(datawise),并且都可以正常工作

但是,当我将它们添加到画布时,即使我使用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个,直到完成为止?

我会:

  • 使用网格而不是画布作为父容器
  • 将一批复选框添加到容器(可能是stackpanel)
  • 将容器添加到网格中
  • 在中设置容器的动画
  • 从步骤2重复,直到完成

  • 如果您从后台线程驱动添加,则可以在调用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