Если у вас есть большое количество экземпляров Shape, вы можете построить их асинхронно (в рабочем потоке) и поставить в очередь фактические операции Add с помощью Dispatcher. Идея заключается в том, что пользовательский интерфейс не будет сразу завершен, но пользователь может начать взаимодействовать сразу же, пока элементы продолжают загружаться.
РЕДАКТИРОВАТЬ: Выше указано неверно. WPF требует создания визуальных элементов в потоке пользовательского интерфейса. Вы все еще можете выполнить «ленивую» визуальную загрузку, используя шаблон, подобный следующему:
private Random _random = new Random();
private void Window_Loaded(object sender, RoutedEventArgs e)
{
Thread testThread = new Thread(TestThread);
testThread.Start();
}
private void TestThread()
{
for (int i = 0; i < 1000; i++)
{
Dispatcher.BeginInvoke((Action)CreateShape);
}
}
private void CreateShape()
{
var shape = new Rectangle();
shape.Width = _random.Next(10, 50);
shape.Height = _random.Next(10, 50);
shape.Fill = new SolidColorBrush(Colors.Red);
Canvas.SetLeft(shape, _random.Next(0, 400));
Canvas.SetTop(shape, _random.Next(0, 200));
LayoutRoot.Children.Add(shape);
}
Это в основном ставит в очередь задачи, которые должны выполняться «асинхронно» в потоке пользовательского интерфейса (т. Е. Всякий раз, когда обслуживается насос сообщений), так что вы можете поддерживать отзывчивость при выполнении «длинного» обновления пользовательского интерфейса.