WPF消息泵队列未快速处理

时间:2016-06-02 17:11:56

标签: c# wpf input message-queue

我正在使用自定义TreeView创建WPF应用程序并手动实现折叠,展开,折叠子树,展开子树事件。通过“扩展子树”,我的意思是递归地扩展树节点及其所有子节点,就像在常规Windows树视图上按“*”时所发生的那样。

我的问题是,我的扩展/崩溃处理程序可能需要相对较长的时间来完成某些树。这允许用户例如重复发出连续折叠子树并一遍又一遍地扩展子树命令对。因此,即使在它们停止混搭密钥之后,事件队列仍然包含这些事件,并且在用户停止输入任何输入后几秒钟处理它们。

滚动内容时也会发生这种情况:输入设备物理停止报告输入后,消息泵处理上,下,页面向上,向下翻页等事件。

我想知道如何防止此行为并停止处理排队输入。这也是使用现有功能的问题,例如按下UP,DOWN,PAGE UP,PAGE DOWN键,我没有实现任何自定义逻辑。

我已经尝试在处理时检查密钥是否实际关闭,但它没有帮助。键盘类似乎反映了消息泵中的状态,而不是物理检查键盘。

protected override void OnKeyDown(KeyEventArgs e)
{
    //)
    if (e.Key == Key.Multiply && Keyboard.IsKeyDown(Key.Multiply)) // Do a custom expand subtree
    {
        // ...
        e.Handled = true;
    }
    else if (e.Key == Key.Divide && Keyboard.IsKeyDown(Key.Divide)) // Do a custom collapse subtree
    {
        // ...
        e.Handled = true;
    }
    // ...
}

欢迎任何想法。感谢。

更新 我想指出,这个问题在Windows中已经存在了。这不仅仅是我写的代码。

例如,打开注册表编辑器(regedit.exe),找到HKEY_USERS,选择它,然后粉碎全部(热键:*)然后折叠(热键: - )几次:看不响应的UI。您可以在*-*-*-序列的末尾点击向上或向下,并在展开/折叠周期结束后的几秒钟内体验选择更改。

0 个答案:

没有答案