2

如果您在 TreeView 的 keydown 事件中打开任何模式对话框(或者如果焦点位于 TreeView 上,则在 KeyPreview=true 的表单中)您会听到令人讨厌的 DING!

我如何防止它发生?

此 ding 通常是未处理键事件的信号(例如,默认情况下 TextBox 将为 Ctrl+A 等进行 ding)。但是,设置 e.Handled 或 e.SuppressKeyPress 对 TreeView 中的模态对话框没有帮助。除了打开模式对话框之外,它在做任何事情时都会有所帮助!

4

3 回答 3

6

当您在其中一个事件中抽取消息循环时,本机 Windows 树视图控件会变得非常古怪。标准的解决方案是延迟事件的处理,直到所有事件都完成。使用 Control.BeginInvoke() 方法很容易做到。在这种情况下也工作过:

    private void treeView1_KeyDown(object sender, KeyEventArgs e) {
        e.Handled = e.SuppressKeyPress = true;
        this.BeginInvoke(new Action(() => 
            (new Form1()).ShowDialog()
        ));
    }
于 2012-04-26T06:29:11.190 回答
0

使用ProcessCmdKey捕获击键对我有用。覆盖表单的此方法:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
    if (keyData == (Keys.O | Keys.Control))
    {
        openFileDialog1.ShowDialog();
        return true;
    }

    return base.ProcessCmdKey(ref msg, keyData);
}

返回 true 以表明击键已被表单消耗并停止进一步处理。

于 2012-04-26T07:01:24.463 回答
0

万一它对某人有帮助...

我在 TreeView 上遇到了同样的问题,除了我在 KeyPreview 设置为 true 的情况下处理表单中的事件。

就我而言,我只是忘记设置e.Handled = true;.

于 2021-09-20T01:35:10.253 回答