【问题标题】:C# Form - MouseClick will click the actual control after losing form focusC# Form - MouseClick 会在失去表单焦点后点击实际控件
【发布时间】:2018-12-15 16:28:29
【问题描述】:

如果您曾经从 Chrome/FireFox/Visual Studio 等任何专业应用程序中移除焦点,然后重新单击按钮/菜单项,它实际上会单击它,就好像您从未失去焦点一样。

如何在 C# WinForm 中应用相同的概念?我尝试了很多类似

private void form1_MouseClick(object sender, MouseEventArgs e)
    {
        BringToFront();
        Activate();
    }

Activate/focus/select/etc... 没有什么能以同样的方式做出反应,实际点击菜单总是需要点击 3-4 次!

我曾想过为每个控件创建一个点击事件,但这似乎相当多余。

Check this for example (Yellow Clicks)

【问题讨论】:

  • 不清楚你想要实现什么。为什么即使 Form 没有焦点,你也想点击 Form 上的控件?
  • 好吧,问题是如果您 Alt+Tab 退出并 Alt+tab 重新进入,您将无法单击“菜单项”,需要单击 2 次。现在,如果您的整个表单没有被聚焦,那么您单击“菜单项”将需要 3-4 次单击才能触发操作。
  • 我会录制一个gif并上传它以显示问题所在,我想我的解释不好
  • @TaW 我上传并附加到我的原始帖子视频
  • 您对菜单的看法是正确的。 (虽然不是按钮,imo)。试试这个:private void menuStrip1_MouseEnter(object sender, EventArgs e) { menuStrip1.Focus(); }

标签: c# forms winforms click controls


【解决方案1】:

你说得对,菜单需要额外点击才能获得焦点。

这很烦人,因为菜单无论如何都会突出显示但对第一次点击没有反应..

您可以通过编写MouseEnter 事件来避免这种情况:

private void menuStrip1_MouseEnter(object sender, EventArgs e)
{
    // either 
    menuStrip1.Focus();
    // or
    this.Focus();
}

这样做的缺点是,它会从其他应用程序中窃取焦点,这不是一个表现良好的应用程序应该做的事情。..

所以我认为最好等待一个明确的用户操作;以类似的方式对MouseDown 事件进行编码..:

private void menuStrip1_MouseDown(object sender, MouseEventArgs e)
{
    menuStrip1.Focus();
}

或使用为该场合制作的活动:

private void menuStrip1_MenuActivate(object sender, EventArgs e)
{
    menuStrip1.Focus();
}

不过,我无法确认按钮或任何其他控件是否存在类似问题。

【讨论】:

  • 你说得对,MouseEnter 引起了一些奇怪的事情。我使用 menuStrip1_MenuActivate >> menuStrip1.Focus(); && form1_Enter >> this.Focus();
【解决方案2】:

我找到了解决您问题的窍门。它对我有用 100%

查看此代码:

    dynamic elem1;
    private void menuStrip1_MouseEnter(object sender, EventArgs e)
    {
        elem1 = sender;
    }
    private void menuStrip1_MouseLeave(object sender, EventArgs e)
    {
        elem1 = null;
    }

    private void Form1_Activated(object sender, EventArgs e)
    {
        if(elem1 != null){
            elem1.PerformClick();
            if (elem1.GetType().ToString() == "System.Windows.Forms.ToolStripMenuItem") elem1.ShowDropDown();
        }
        elem1 = null;
    }

这里发生了什么。 当鼠标进入按钮/菜单项 elem1 = 这个按钮/菜单,当鼠标离开它设置回 null。 所以当表单被激活时,我们可以调用 elem1.PerformClick() 来点击按钮/菜单项。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-08
    • 1970-01-01
    • 2011-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多