none
异步添加控件 RRS feed

  • 问题

  •   如下代码

      private void Button_Click(object sender, RoutedEventArgs e)
            {    
                float off = 5.0f;
                for (int i = 0; i < 1000; i++)
                {
                    Button b = new Button();
                    canvas.Children.Add(b);
                    b.Background = new SolidColorBrush(Colors.White);
                    b.Foreground = new SolidColorBrush(Colors.Blue);
                    b.Width = 300;
                    b.Height = 100;
                    b.Content = "Button" + i.ToString();
                    b.SetValue(Canvas.LeftProperty, 10.0);
                    b.SetValue(Canvas.TopProperty, 5.0 + i * 105.0);
                    off += 105.0f;
                    b.Visibility = System.Windows.Visibility.Visible;
    
                }
                canvas.Height = off;
    
            }

    Windows phone 应用中,点击一个按钮,然后向页面中已有的 Canvas 控件中动态添加很多控件,(比如几千个),

    为了不影响UI线程,怎么把这个添加的过程写成一个 异步 函数?


    • 已编辑 Fenty000 2013年9月25日 7:23
    2013年9月25日 7:16

全部回复

  •         private void Button_Click(object sender, RoutedEventArgs e)
            {
                float off = 5.0f;
                new Thread(() =>
                    {
                        for (int i = 0; i < 1000; i++)
                        {
                            Dispatcher.BeginInvoke(() =>
                                {
    
                                    Button b = new Button();
                                    canvas.Children.Add(b);
                                    b.Background = new SolidColorBrush(Colors.White);
                                    b.Foreground = new SolidColorBrush(Colors.Blue);
                                    b.Width = 300;
                                    b.Height = 100;
                                    b.Content = "Button" + i.ToString();
                                    b.SetValue(Canvas.LeftProperty, 10.0);
                                    b.SetValue(Canvas.TopProperty, 5.0 + i*105.0);
                                    off += 105.0f;
                                    b.Visibility = System.Windows.Visibility.Visible;
                                });
                            Thread.Sleep(1000);
                        }
    
                    }).Start();
                canvas.Height = off;
    
            }


    2013年10月10日 14:06
  • 将你的创建操作写进另一个方法:

    private void CreateControls(int i) {

    if(i<1000)

    { //你的操作; Dispatcher.BeginInvoke(()=>CreateControls(i+1),System.Windows.Threading.DispatcherPriority.SystemIdle); //第二个参数是操作优先级,可以自己改

    } }

    然后在Button_Click里面这样调用:

    Dispatcher.BeginInvoke(()=>CreateControls(0),System.Windows.Threading.DispatcherPriority.SystemIdle);

    原理就是创建完成一个控件以后再用BeginInvoke创建下一个,是可以保证同步顺序的异步操作,甚至可以通过修改完成条件来对创建过程进行控制

    还可以随时汇报任务完成进度。因为我把优先级设为最低,所以在系统繁忙时可能会自动暂停,你可以把优先级调高,但太高的话还是有可能阻塞界面
    • 已编辑 Laferce 2013年10月10日 17:55 增加描述
    2013年10月10日 17:46