C# Form - MouseClick失去表单焦点后会点击实际控件
C# Form - MouseClick will click the actual control after losing form focus
如果您从 Chrome/FireFox/Visual Studio 等任何专业应用程序中移除焦点,然后重新单击某个 button/menu 项目,它实际上会单击它,就好像您从未失去焦点一样。
如何在 C# WinForm 中应用相同的概念?我尝试了很多东西,比如
private void form1_MouseClick(object sender, MouseEventArgs e)
{
BringToFront();
Activate();
}
Activate/focus/select/etc...没有任何反应以同样的方式起作用,实际点击菜单总是需要 3-4 次点击!
我考虑过为每个控件制作一个点击事件,但这似乎是多余的。
Check this for example (Yellow Clicks)
关于 Menues 需要额外点击以获得焦点的说法,你是对的。
这很烦人,因为菜单无论如何都会突出显示,但对第一次点击没有反应..
您可以通过编写 MouseEnter
事件代码来避免这种情况:
private void menuStrip1_MouseEnter(object sender, EventArgs e)
{
// either
menuStrip1.Focus();
// or
this.Focus();
}
这样做的缺点是,它正在窃取其他应用程序的焦点,这不是一个行为良好的应用程序应该做的事情..
所以我认为最好等待最终的用户操作;以类似的方式对 MouseDown
事件进行编码......:[=15=]
private void menuStrip1_MouseDown(object sender, MouseEventArgs e)
{
menuStrip1.Focus();
}
或使用专为该场合举办的活动:
private void menuStrip1_MenuActivate(object sender, EventArgs e)
{
menuStrip1.Focus();
}
不过,我无法确认按钮或任何其他控件是否存在类似问题。
我找到了解决您问题的技巧。它对我有用 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;
}
这里发生了什么。
当鼠标进入 button/menu item elem1 = this button/menu 时,当鼠标离开时它设置回 null。
所以当表单激活时,我们可以调用 elem1.PerformClick() 来单击 button/menu 项。
如果您从 Chrome/FireFox/Visual Studio 等任何专业应用程序中移除焦点,然后重新单击某个 button/menu 项目,它实际上会单击它,就好像您从未失去焦点一样。
如何在 C# WinForm 中应用相同的概念?我尝试了很多东西,比如
private void form1_MouseClick(object sender, MouseEventArgs e)
{
BringToFront();
Activate();
}
Activate/focus/select/etc...没有任何反应以同样的方式起作用,实际点击菜单总是需要 3-4 次点击!
我考虑过为每个控件制作一个点击事件,但这似乎是多余的。
Check this for example (Yellow Clicks)
关于 Menues 需要额外点击以获得焦点的说法,你是对的。
这很烦人,因为菜单无论如何都会突出显示,但对第一次点击没有反应..
您可以通过编写 MouseEnter
事件代码来避免这种情况:
private void menuStrip1_MouseEnter(object sender, EventArgs e)
{
// either
menuStrip1.Focus();
// or
this.Focus();
}
这样做的缺点是,它正在窃取其他应用程序的焦点,这不是一个行为良好的应用程序应该做的事情..
所以我认为最好等待最终的用户操作;以类似的方式对 MouseDown
事件进行编码......:[=15=]
private void menuStrip1_MouseDown(object sender, MouseEventArgs e)
{
menuStrip1.Focus();
}
或使用专为该场合举办的活动:
private void menuStrip1_MenuActivate(object sender, EventArgs e)
{
menuStrip1.Focus();
}
不过,我无法确认按钮或任何其他控件是否存在类似问题。
我找到了解决您问题的技巧。它对我有用 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;
}
这里发生了什么。 当鼠标进入 button/menu item elem1 = this button/menu 时,当鼠标离开时它设置回 null。 所以当表单激活时,我们可以调用 elem1.PerformClick() 来单击 button/menu 项。