为什么需要两次点击才能单击ToolStripMenu项?

4
我有一个Winform应用程序正在运行,我在其上添加了另一个Winform,该Winform将向应用程序传递一些数据。在将数据传递给应用程序之后,保存按钮将启用以保存数据到应用程序中。保存按钮是工具栏菜单项。我面临的一个问题是当新添加的表单仍然存在时,我需要点击两次才能保存,即第一次单击将无法正确单击。或者如果我关闭新添加的Winform,则保存单击将首先发生,或者如果我单击现有应用程序的任何部分,即焦点将在那里,那么第一次单击也会执行。
3个回答

12

添加此方法覆盖到包含工具栏的表单即可解决问题。

protected override void WndProc(ref Message m)
{
    const int WM_PARENTNOTIFY = 0x0210;
    if (m.Msg == WM_PARENTNOTIFY)
    {
        if (!Focused)
            Activate();
    }
    base.WndProc(ref m);
}
工具栏仅执行Activate调用,因此通过自己处理它,它将执行Click事件。

工具栏仅执行Activate调用,因此通过自己处理它,它将执行Click事件


太棒了!这节省了很多烦恼。 - Brad Bruce

0

你已经很好地回答了自己的问题:新表单在添加时会获得焦点。所以,如何处理这个“按设计”的问题取决于你:

  • 在其他表单传递数据后将主表单置于前台;
  • 完全关闭其他表单;
  • 显示一个描述性消息,让用户知道他们可以保存;
  • ...
  • 利润!

;)


我们不能关闭其他窗体并将主窗体置于前端,这是基于用户需求完成的。我们能否进行检查,例如是否有焦点,然后只在该时刻启用保存按钮? - ponting
2
你可以尝试访问https://dev59.com/0U7Sa4cB1Zd3GeqP33ty。 - Max Yakimets
正确答案:Kleinux - Pedro77

0

当您在主表单中启用保存按钮时,必须在某个时刻调用Focus()。这样焦点就会返回到主表单,用户可以执行一次点击以保存。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接