如何删除WPF中控件的构建事件中的所有相关内容?
答案 0 :(得分:1)
没有简单的方法可以删除Dispatcher
上排队的所有事件。即使有,你也不想这样做,因为它会破坏许多依赖于后台事件来更新其数据结构和UI的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方法,以避免丢弃应该保留的事件。
最后一个想法:您是否考虑过在后台线程上进行长时间运行,以便UI保持响应?很多时候,这是一个比单击项目时锁定UI更好的解决方案,并删除了任何想要刷新队列的原因。