WP7 добавить партии элементов в мою сцену - PullRequest
0 голосов
/ 05 апреля 2011

В моем приложении WP7 есть сцена, которая содержит около 250 флажков с пользовательскими шаблонами.

Все флажки подготовлены (с данными) в фоновом потоке, и все работает нормально.

Но когда я добавляю их в Canvas, даже если я использую Dispatcher, кажется, что он полностью застрял в потоке пользовательского интерфейса.

Есть ли хороший способ добавлять их партиями, чтобы они почти постепенно появлялись на сцене?

Это моя текущая реализация

        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это все еще убивает поток пользовательского интерфейса.

Как я могу добавить, скажем, 10, пока я не закончу?

Ответы [ 2 ]

1 голос
/ 05 апреля 2011

Я бы:

  1. Использовать сетку, а не холст в качестве родительского контейнера
  2. Добавить пакет флажков в контейнер (возможно, стековую панель)
  3. Добавить контейнер в сетку
  4. Анимация контейнера в
  5. повторить с шага 2 до завершения
0 голосов
/ 05 апреля 2011

Если вы добавляете это из фонового потока, вы можете добавить вызов Thread.Sleep (1) в фоновом потоке между вызовами Dispatcher, чтобы позволить потоку пользовательского интерфейса обрабатывать ваш рабочий элемент. Вот упрощенный пример добавления прямоугольников на холст:

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);                
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...