silverlight 4 - самый быстрый / простой способ планирования работы в потоке пользовательского интерфейса? - PullRequest
0 голосов
/ 09 февраля 2011

Дерево интерфейса:

  • список со списком инструментов апреля 2010 года listboxdragdroptarget
  • шаблон элемента списка содержит элемент управления, имеющий пару кнопок
  • рассматриваемый обработчик щелчка находится на одной из этих кнопок (и, следовательно, является частью фактического элемента списка в пользовательском интерфейсе, поэтому возможна операция перетаскивания)
  • общий элемент списка должен быть в состоянии перетащить (переставить внутри списка или переместить в другой список), но цель состоит в том, чтобы обработчики щелчков на этих кнопках не вызывали перетаскивание

В настоящее время обработчик щелчков на одной из кнопок (см. Выше), по-видимому, занимает достаточно много времени (он выполняет множество обновлений для модели представления, которые вызывают различные другие изменения пользовательского интерфейса, поэтому он должен быть в потоке пользовательского интерфейса AFAICT) что это очень часто вызывает начало события перетаскивания.

Первая мысль о том, чтобы извлечь этот код из обработчика кликов, - это создать BackgroundWorker без DoWork и поместить все это в RunWorkerCompleted. Тем не менее, это похоже на злоупотребление BackgroundWorker и своего рода тяжеловес. Эффект, который я хочу, похож на PostThreadMessage в том же потоке (в потоке пользовательского интерфейса), но я не вижу ничего такого, что заставило меня сделать это быстро.

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

1 Ответ

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

Я думаю, что Dispatcher.BeginInvoke с низким DispatcherPriority ведет себя почти как PostThreadMessage.

...