【问题标题】:Difference Between Mouse and Key events ToolStripMenuItem鼠标和按键事件 ToolStripMenuItem 之间的区别
【发布时间】:2013-11-18 15:23:17
【问题描述】:

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

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

  1. 在父窗体中调用 Form.Activate(),并处理 Activated 事件以聚焦文本框。

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

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

【问题讨论】:

  • 就调用给定事件而言,这两种情况之间应该没有任何区别。我在这里看到两个可能的问题:要么你在另一个事件中做某事,而这两种情况都没有触发(例如:KeyUp 不是由鼠标触发的);或者在这两种情况下都没有达到点击事件(你说这没有发生......)。无论如何,最好看一下代码,请发布相关部分。
  • @varocarbas -- 我通过创建一个简单的测试示例验证了他的问题。出于某种原因,ToolStripButton 类没有任何与键盘相关的事件。
  • 我已经能够重现你的情况(当然很奇怪,毫无疑问);尽管您得到的答案似乎并没有提供始终有效的解决方案(有时有效,有时无效),但也许这是您拥有的最好的东西......
  • @roryap 如上面评论中所述;不知道这种奇怪的情况。只是一些澄清:我没有建议使用任何与键相关的事件,只是写了一个可能是对该问题的合理解释的示例(但显然,没有合理的解释:只是纯粹的怪异);我测试了您的代码,并且正如预期的那样(就表单事件而言),并不是 100% 准确(无论如何我已经 +1 了),这取决于用户选择的内容(表单与否)。在 OP 的位置上,我会做一些测试以提出一个可靠的解决方案。
  • @varocarbas 我很好奇在什么情况下您能够看到此解决方案不起作用?如果你找到了我想知道的,我可以解决它。它似乎对我来说足够了。如果将来我确实遇到了问题,我将不得不弄清楚。感谢您的反馈!

标签: c# .net winforms mdi


【解决方案1】:

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

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 布尔值,如图所示。

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

【讨论】:

  • 很高兴为您提供帮助。顺便说一句,您应该查看 Martin Carolan 的 EventSpy:codeproject.com/Articles/11918/EventSpy。它可以帮助您弄清楚在这种情况下触发了哪些事件。我在 Form、ToolStrip 和按钮上注册了它,这就是我意识到 Form 的“KeyUp”事件在其他所有内容之后触发的方式。
  • 更奇怪的是,原始过程在调试时按预期工作。我认为这可能与调试过程有关,导致线程在断点之外的某些事件需要更长的时间才能在 focus() 完成之前触发。
  • @Wanabrutbeer .NET 非常可靠,但是当它做出奇怪的事情时,它们真的非常非常奇怪:) 所以,我建议你不要浪费时间去想出一个解释(它是只是一种错误,大概会存在很长一段时间),但是要彻底验证您的解决方案;正如上面的 cmets 所说:这不是 100% 准确的,您很可能需要进一步修正来补充它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-23
  • 1970-01-01
  • 1970-01-01
  • 2021-06-27
  • 2011-11-18
  • 2021-06-01
相关资源
最近更新 更多