鼠标和键事件之间的区别ToolStripMenuItem

时间:2013-11-18 15:23:17

标签: c# .net winforms mdi

所以我在处理情况时遇到了一些问题。我有一个应用程序,它是一个MDI应用程序,它打开自定义文档。我的MDI父级有一个ToolStrip,带有一些控件,一个文本框和一个按钮。文本框包含项目的数量值,然后有一个按钮将项目添加到文档中。最快操作的模型是,从数量文本框开始,输入数量,选项卡到零件编号文本框并输入零件号,然后选项卡到添加按钮并按Enter键或空格键。这比使用鼠标单击按钮或单击进入文本框要快。所以我希望我的应用程序在按钮被触发后自动聚焦数量文本框。

我已经处理了ToolStripMenuItem.Click事件,该事件添加了该项目,然后重新复制了数量框,当鼠标用于单击按钮时,它可以正常工作。但由于某种原因,我还没有发现,这在键盘触发按钮时不起作用。我知道点击事件正在被触发,因为项目被正确添加,但焦点未正确处理。事实上,在这种情况下,似乎焦点完全丢失,标签停止运行,除了鼠标之外无法重新获得焦点。我尝试了以下内容:

  1. 调用Form.Activate()i父表单,并处理Activated事件以聚焦文本框。

  2. 在父表单上调用Focus(),并处理GotFocus事件以聚焦文本框。

  3. 就好像底层框架无法正确处理关键事件,并且没有为ToolStripMenuItemButton控件公开Key事件。我有点不知所措。该应用程序功能正常,因为鼠标可以工作,实际上可以使用该应用程序,但为了获得最佳功能,我需要使其正常工作,以便无需使用鼠标即可快速输入数据。

1 个答案:

答案 0 :(得分:3)

你是对的,这是一种奇怪的行为。我能够像这样克服它:

public partial class Form1 : Form
{
    bool myButtonJustClicked = false;

    public Form1()
    {
        InitializeComponent();
    }

    private void toolStripButton1_Click(object sender, EventArgs e)
    {
        myButtonJustClicked = true;
        toolStripTextBox1.Focus();
    }

    private void Form1_KeyUp(object sender, KeyEventArgs e)
    {
        if(myButtonJustClicked)
        {
            toolStripTextBox1.Focus();
            myButtonJustClicked = false;
        }
    }
}

基本上,我正在使用表单的“KeyUp”事件来处理应该在按钮上触发的KeyUp事件,但没有“KeyUp”事件或任何与键盘相关的事件,由于某种原因在ToolStripButtons。

为了确保当其他KeyUp事件在表单中的其他地方触发时文本框没有获得焦点,我使用myButtonJustClicked布尔值,如图所示。

此外,当然,我在toolStripTextBox1.Focus();方法中留下toolStripButton1_Click来处理鼠标点击。