создавать пользовательские элементы управления Wpf в другом потоке - PullRequest
1 голос
/ 03 февраля 2011

Я пытаюсь создать некоторые пользовательские элементы управления, используя другой поток, и я использую такой код:

    private void btnDemo_Click(object sender, RoutedEventArgs e)
    {
      Task tsk = Task.Factory.StartNew(() =>
      {
        for (int i = 0; i < 3; i++)
        {
          MyControl sprite = new MyControl();
          pnlTest.Children.Add(sprite);
        }
      });
    }

Но я получаю это исключение в конструкторе UserControl:

The calling thread must be STA, because many UI components require this.

Я не уверен, что использую правильный подход для этого. Пожалуйста, не могли бы вы помочь мне с этим.

спасибо.

Ответы [ 3 ]

2 голосов
/ 03 февраля 2011

Создание элементов управления может быть сделано в любом потоке, но их добавление в графический интерфейс должно быть синхронизировано с основным потоком

В этом случае, всего 3 элемента управления, забудьте о задачах и просто сделайте это напрямую, однопоточным.

1 голос
/ 03 февраля 2011

Вы можете отправить операцию добавления элементов управления в коллекцию Children в поток пользовательского интерфейса, используя Dispatcher:

private void btnDemo_Click(object sender, RoutedEventArgs e)
{
  Task tsk = Task.Factory.StartNew(() =>
  {
    for (int i = 0; i < 3; i++)
    {
      Dispatcher.BeginInvoke(new Action(() => {
         MyControl sprite = new MyControl();
         pnlTest.Children.Add(sprite);
      }));
    }
  });
}

Вызывая BeginInvoke в Dispatcher, вы в основном добавляете операцию в очередь для выполнения в потоке пользовательского интерфейса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...