C# 鼠标事件和按键事件ToolStripMenuItem之间的差异

C# 鼠标事件和按键事件ToolStripMenuItem之间的差异,c#,.net,winforms,mdi,C#,.net,Winforms,Mdi,所以我在处理一种情况时有点困难。我有一个应用程序,它是一个MDI应用程序,可以打开自定义文档。我的MDI父对象有一个ToolStrip,带有几个控件、一个文本框和一个按钮。文本框保存项目的数量值,然后有一个按钮将项目添加到文档中。最快操作的模式是,从“数量”文本框开始,在“零件号”文本框中输入“数量”,然后在“零件号”文本框中输入“零件号”,然后在“添加”按钮上单击“选项卡”,然后按enter键或空格键。这比使用鼠标单击按钮或单击进入文本框要快得多。因此,我希望我的应用程序在启动按钮后自动聚焦“

所以我在处理一种情况时有点困难。我有一个应用程序,它是一个MDI应用程序,可以打开自定义文档。我的MDI父对象有一个ToolStrip,带有几个控件、一个文本框和一个按钮。文本框保存项目的数量值,然后有一个按钮将项目添加到文档中。最快操作的模式是,从“数量”文本框开始,在“零件号”文本框中输入“数量”,然后在“零件号”文本框中输入“零件号”,然后在“添加”按钮上单击“选项卡”,然后按enter键或空格键。这比使用鼠标单击按钮或单击进入文本框要快得多。因此,我希望我的应用程序在启动按钮后自动聚焦“数量”文本框

我已经处理了ToolStripMenuItem.Click事件,它添加了项目,然后重新聚焦数量框,当使用鼠标单击按钮时,它可以完美地工作。但由于某种原因,我还没有发现,当键盘触发按钮时,这不起作用。我知道点击事件正在被触发,因为项目被正确添加,但是焦点没有被正确处理。事实上,在这种情况下,焦点似乎完全丢失,选项卡停止工作,焦点无法恢复,除非使用鼠标。我尝试了以下方法:

  • 调用Form.Activate()i父窗体,并处理激活的事件以聚焦文本框

  • 在父窗体上调用Focus(),并处理GotFocus事件以聚焦文本框


  • 就好像底层框架无法正确处理关键事件,并且ToolStripMenuItemButton控件没有公开关键事件一样。我有点不知所措。应用程序是功能性的,因为鼠标可以工作,应用程序实际上可以使用,但为了实现最佳功能,我需要让它工作起来,以便在不使用鼠标的情况下快速输入数据。

    你说得对,这是一种奇怪的行为。我可以这样克服它:

    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事件,但由于某些原因,ToolStripButtons上没有“KeyUp”事件或任何与键盘相关的事件

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


    另外,我留下了
    toolStripTextBox1.Focus()toolStripButton1\u Click
    方法中的code>处理鼠标单击。

    就调用给定事件而言,这两种情况之间应该没有任何区别。我在这里看到了两个可能的问题:要么你在另一个事件中做了一些在两种情况下都没有触发的事情(例如:按键没有被鼠标触发);或者,在这两种情况下都未达到单击事件(您说的是,这不会发生…)。在任何情况下,最好看一下代码,请发布相关部分。@varocabas——我通过创建一个简单的测试示例验证了他的问题。出于某种原因,ToolStripButton类没有任何与键盘相关的事件;虽然你得到的答案似乎并没有提供一个始终有效的解决方案(有时有效,有时无效),但也许这是你所拥有的最好的东西…@roryap,如上面的评论所说;不知道这种奇怪的情况。只是几点澄清:我没有建议使用任何关键的相关事件,只是写了一个可能是问题的合理解释的例子(但是,显然,没有合理的解释:只是纯粹的古怪);我测试了您的代码,正如预期的那样(就涉及表单事件而言),它不是100%准确的(无论如何,我已经告诉过您),这取决于用户选择了什么(表单还是非表单)。在OP的位置上,我会做一些测试,以得出一个肯定有效的解决方案。@varocarbas我很好奇,你能看到什么情况下这个解决方案不起作用?如果你找到一个我想知道的,这样我就可以解决它。这对我来说似乎已经足够了。如果我将来遇到问题,我必须弄清楚。谢谢你的反馈!很乐意帮忙。顺便说一句,你应该看看Martin Carolan的EventSpy:。它可以帮助您了解在这种情况下会触发哪些事件。我在表单、ToolStrip和按钮上注册了它,这就是我如何意识到表单的“KeyUp”事件是在其他所有事件之后触发的。更奇怪的是,调试时原始流程按照预期工作。我认为这可能与调试过程有关,导致线程在完成focus()之前触发断点之外的某些事件所需的时间更长。@Wanabrutbeer.NET非常可靠,但当它做出奇怪的事情时,它们确实非常奇怪:)因此,我建议您不要把时间浪费在打算提出一个解释上(这只是一种可能会存在很长一段时间的bug),而是要彻底验证您的解决方案;正如在上面的评论中所说:这不是100%准确的,你很可能会用进一步的修正来补充它。