如何删除WPF中控件的构建事件中的所有关联?

时间:2010-01-12 12:21:59

标签: wpf events

如何删除WPF中控件的构建事件中的所有相关内容?

1 个答案:

答案 0 :(得分:1)

没有简单的方法可以删除Dispatcher上排队的所有事件。即使有,你也不想这样做,因为它会破坏许多依赖于后台事件来更新其数据结构和UI的WPF控件。

但是,从队列中丢弃所选输入事件的简单方法,例如键盘,鼠标和手写笔事件:

  1. 创建一个“FlushInputQueue”方法,用InputManager.PreprocessInput注册事件处理程序,在输入优先级调用DispatcherOperation,然后删除事件处理程序。

  2. PreprocessInput事件触发时,检查输入消息并将Handled标志设置为true,如果要丢弃它。

  3. 以下是一些可以帮助您入门的代码:

    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更好的解决方案,并删除了任何想要刷新队列的原因。