2011-04-05 40 views
0

我在我的WP7应用程序中有一个场景,其中包含约250个带有自定义模板的复选框。WP7将批量元素添加到我的场景

复选框都在后台线程上准备(数据),并且一切正常。

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

回答

1

我想:

  1. 使用网格而不是画布父容器
  2. 一批复选框添加到容器(可能是一个StackPanel)
  3. 容器添加到网格
  4. 动画在来自步骤2
  5. 重复的容器中,直到完成
+0

好几个问题,1.为什么? 2.我需要绝对定位复选框,因此Canvas.SetTop/Left – Mark 2011-04-05 11:11:09

0

如果您驱动从后台线程添加此项,您可以在对调度程序调用之间的后台线程上添加对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);     
    } 
}