Можно ли прервать цикл сообщений Windows? - PullRequest
0 голосов
/ 25 октября 2010

У меня есть приложение wpf, которое заполняет Infragistics XamDataGrid обычным способом привязки наблюдаемой коллекции к сетке. Когда каждый элемент данных заполняется в коллекцию, по одному обновляется сетка. У меня также есть кнопка отмены, которую я хотел бы немедленно остановить, если пользователь нажмет ее. Однако для отмены требуется несколько секунд или более.

Проблема (я думаю) состоит в том, что цикл сообщений полон событий заполнения сетки, и моя отмена находится далеко позади и должна ждать своей очереди. Мне было интересно, есть ли способ вставить сообщение в начало очереди и таким образом сделать отмену более отзывчивой (хакерской или нет - если хакерской, пожалуйста, объясните, какие негативные последствия я могу ожидать).

Я не испытываю плохой работы; на самом деле интерфейс довольно отзывчивый. Проблема только в том, что событие отмены должно ждать своей очереди в очереди сообщений, и я бы предпочел, чтобы оно имело приоритет над сообщениями о населении.

редактировать: уточнения

Ответы [ 2 ]

1 голос
/ 28 октября 2010

В итоге получился DispatcherPriority:

 private void btnCancel_Click(object sender, System.Windows.RoutedEventArgs e)
        {
            Dispatcher.Invoke(new Action(() => btnCancel.Command.Execute(null)), DispatcherPriority.Send);
        }

Приоритет «Отправить» является самым высоким из перечислимого типа, а «SystemIdle» - самым низким. Когда я вызываю команду кнопки с таким приоритетом, Отмена проходит немедленно.

1 голос
/ 25 октября 2010

Когда вы говорите Grid, что вы имеете в виду под Grid? Я думаю, что ваша проблема может заключаться в том, что для большой коллекции эта установка может не использовать какой-либо тип виртуализации элементов. Возможно, в этом случае лучше использовать ListBox или ListView, который может использовать VirtualizingStackPanel для генерации элементов UIE только для элементов на экране.

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

...