Причина, по которой мы связываемся с ObservableCollection, заключается в том, что происходит встроенное уведомление об обновлениях свойств через реализацию интерфейса INotifyPropertyChanged.Это приводит к тому, что событие запускается при каждом обновлении базовой коллекции, что, в свою очередь, вызывает перерисовку связанных элементов UI (в данном случае ListBox).Шаблон данных применяется к каждому перерисовыванию для каждого элемента в коллекции и автоматически выполняется посредством привязки данных.Элементы добавляются в вашу коллекцию быстрее, чем может быть проведено рисование (в отдельном потоке), поэтому, по-видимому, ваша загрузка задерживается до тех пор, пока не будут добавлены все элементы.Вы пропускаете циклы перерисовки визуально на экране, поскольку они рисуются и становятся недействительными на экране при добавлении новых элементов.
Это означает, что ваш вызов Thread.Sleep только задерживает полную перерисовку элемента для каждого элементаэто добавляется (* количество добавляемых элементов объясняет, почему ваш пользовательский интерфейс перерисовывается полностью для каждого элемента, но только после того, как все сделали соответствующие вызовы Thread.Sleep, которые блокируют поток пользовательского интерфейса на время n * sleepValue).Вот почему нам нужно использовать объект Dispatcher, как указано выше, поскольку эти вызовы выполняются в другом потоке.Это позволяет нам перерисовывать поток пользовательского интерфейса, который, по сути, синхронизирует вызовы блокировки.
Я бы совершенно не использовал здесь Диспетчер, поскольку он является избыточным и препятствует выполнению собственной синхронизации, поскольку диспетчер может ссылаться на него.элемент, который еще не был создан и добавлен к визуальным или логическим деревьям (как ясно из вашего комментария по установке значения до 1000 мс против 20 мс).Вы по-прежнему будете перерисовывать все элементы в коллекции, поскольку каждый из них добавляется, делая ваш спящий вызов недействительным или нефункциональным из-за отсутствия лучшего термина.
В качестве альтернативного решения я предлагаю вам добавить раскадровкуанимация свойства Opacity корневого элемента шаблона данных для создания визуального эффекта от элементов, выполняющих что-то «по одному при добавлении».Таким образом, когда каждый элемент добавляется в базовую коллекцию, он будет отрисовываться с помощью анимации исчезновения непрозрачности, создавая иллюзию, что каждый элемент добавляется по одному (и анимируется в вид) с отдельными анимациями (с различными смещениями в пределахопределенная анимация).Я верю, что это даст вам эффект, который вы ищете.Но поскольку вызов draw поступает из ListBox, поскольку он поддерживает свою коллекцию элементов, вся коллекция будет аннулирована при каждом вызове .Add для вашего объекта ViewModel ObservableCollection.На самом деле нет способа переопределить это поведение, так как это происходит на одном уровне выше по иерархии.Я бы посоветовал против предоставленного подхода.