Нет простого способа удалить все события, поставленные в очередь на Dispatcher
.Даже если бы это было так, вам бы этого не хотелось, потому что это сломало бы многие элементы управления WPF, которые используют фоновые события для обновления своих структур данных и пользовательского интерфейса.
Однако, равно простой способ отбросить выбранные входные события из очереди, такие как события клавиатуры, мыши и стилуса:
Создать метод "FlushInputQueue", который регистрирует обработчик событий с помощью InputManager.PreprocessInput
, вызываетDispatcherOperation
с приоритетом ввода, затем удаляется обработчик события.
Когда происходит событие PreprocessInput
, проверьте входное сообщение и установите для флага Handled
значение true, если вы хотитеотмените его.
Вот некоторый код, с которого можно начать:
public void FlushInputQueue()
{
PreProcessInputEvent handler = (obj, e) =>
{
if(ShouldFlushEvent(e.StagingItem.Input))
e.StagingItem.Input.Handled = true;
};
InputManager.PreProcessInput += handler;
Dispatcher.Invoke(DispatcherPriority.Input, new Action(() => {}));
InputManager.PreProcessInput -= handler;
}
private bool ShouldFlushEvent(InputEventArgs e)
{
// Example only:
return e is MouseEventArgs || e is KeyboardEventArgs || e is StylusEventArgs;
}
Вероятно, метод ShouldFlushEvent следует настроить для вашего конкретного сценария, чтобы избежать выброса событий,должно быть сохранено.
И еще одна мысль: не задумывались ли вы над выполнением вашей длительной операции в фоновом потоке, чтобы пользовательский интерфейс оставался отзывчивым?Во многих случаях это лучшее решение, чем блокировка пользовательского интерфейса при щелчке по элементу, и устраняет любую причину необходимости очистки очереди.