Извините, я не очень хорошо знаю XAML, но не могли бы вы попробовать что-то вроде этого?
ПРИМЕЧАНИЕ. Я не думаю, что вы можете использовать объект BackgroundWorker в XAML, но вы можете использовать его в другом классе и найти способ передать в него данные.
Основная идея здесь состоит в том, чтобы перенести вашу работу в другой поток и заполнить ее там.
... хотя я должен сказать: если вы действительно добавляете все свои элементы в одну строку (как показано в вашем модифицированном примере ниже), я сомневаюсь, что это вообще вызовет какое-либо мерцание. Ваше мерцание может исходить откуда-то еще. Существуют ли какие-либо обработчики событий, которые запускаются при изменении источника данных?
void Button_Click(object sender, RoutedEventArgs e) {
using (BackgroundWorker worker = new BackgroundWorker()) {
var items = new int[10000];
worker.DoWork += delegate {
for (int i = 0; i < items.Length; i++)
items[i] = i + 1;
};
worker.RunWorkerCompleted += delegate {
listBox.ItemsSource = items;
};
worker.RunWorkerAsync();
}
}
23.05.2011
listBox
заполняется, происходит что-то еще, что вызывает обновление чего-то еще. Поместите одну точку останова на событиеbutton_click
и запустите свой код. Когда это событиеbutton_click
запускается и ваш отладчик прерывает выполнение, перейдите в каждый сегмент кода в вашем проекте и добавьте точку останова (я знаю, что это займет много времени), затем нажмите F5, чтобы продолжить. Какова первая функция, которая будет затронута после этого? Если эта подпрограмма не запускает обновление, удалите точку останова и снова нажмите F5. Делайте это, пока не найдете настоящую проблему. 25.05.2011