1

我正在 c# 中以 windows 形式实现搜索功能。我已KeyPreview在表单上设置为 true 并添加了一个事件处理程序,KeyDown以便我可以捕获ctrl+f,escenter.

我很好地抓住了这些键,我可以让我的文本框出现,但我无法在框中输入。所有的键都可以,PortsTraceForm_KeyDown(...)但它们永远不会进入文本框。根据 msdn 页面 about KeyPreview,将 e.Handled 设置为 false 应该会导致事件传递到焦点视图(文本框),但这并没有发生。我没有KeyDown为文本框注册事件,所以它应该使用默认行为。我错过了什么吗?

KeyDown 事件:

    private void PortsTraceForm_KeyDown(object sender, KeyEventArgs e)
    {
        e.SuppressKeyPress = true;
        e.Handled = false;

        if (e.KeyData == (Keys.F | Keys.Control)) // ctrl+f
        {
            e.Handled = true;
            ShowSearchBar();
        }
        else if (e.KeyCode == Keys.Escape) // esc
        {
            e.Handled = true;
            HideSearchBar();
        }
        else if (e.KeyCode == Keys.Enter) // enter
        {
            if (searchPanel.Visible)
            {
                e.Handled = true;
                if (searchShouldClear)
                    SearchStart();
                else
                    SearchNext();
            }
        }
    }

显示搜索栏:

    private void ShowSearchBar()
    {
            FindBox.Visible = true;
            FindBox.Focus(); // focus on text box   
    }

隐藏搜索栏:

    private void HideSearchBar()
    {
            this.Focus(); // focus on form
            FindBox.Visible = false;
    }
4

2 回答 2

1

即使您正在调用,您的 TextBox 也可能没有焦点Focus()。从文档中:

Focus 是一种低级方法,主要用于自定义控件作者。相反,应用程序程序员应该对子控件使用 Select 方法或 ActiveControl 属性,或对窗体使用 Activate 方法。

您可以检查成功的返回值Focus(),但过去我没有运气使用该方法将焦点设置为任意控件。相反,请尝试使用文档建议的方法,即 call Select()

编辑:

没关系(尽管它仍然是有效的建议),我想我看到了你的问题:

e.SuppressKeyPress = true

你为什么做这个?同样,来自文档:

[SuppressKeyPress] 获取或设置一个值,该值指示是否应将键事件传递给底层控件

因此,您有意阻止 TextBox 获取关键事件。如果您想通过该事件,则不应将该属性设置为false.

于 2011-09-12T18:13:31.643 回答
0

试试这个例子,覆盖方法。

    protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
    {
        // your code here

        // this is message example
        MessageBox.Show(keyData.ToString());
        return base.ProcessCmdKey(ref msg, keyData);
    }

问候。

于 2011-09-12T19:31:44.923 回答