我有一个MenuStrip
,我使用以下代码使其AutoHide
。它隐藏/显示完美,但是当控件获得焦点时,通过按 Alt 键,MenuStrip
显示但它不处于活动状态,并且快捷键下没有小下划线,例如在"F"下的文件,按"F"不会打开它(。如何正确激活它?
注意:我用MenuDeactivate
代替了它,但它没有完美地工作。
bool menuBarIsHide = true;
bool altKeyIsDown = false;
bool alwaysShowMenuBar=false;
//KeyPreview is true;
//for prevent glitch(open/close rapidly)
void Form1_KeyUp(object sender, KeyEventArgs e)
{
if ((Control.ModifierKeys & Keys.Alt) != 0)
altKeyIsDown = false;
}
void Form1_KeyDown(object sender, KeyEventArgs e)
{
if ((Control.ModifierKeys & Keys.Alt) != 0)
{
if (altKeyIsDown)
return;
if (!alwaysShowMenuBar)
{
if (menuBarIsHide)
{
menuBar.Show();
menuBarIsHide = false;
//manage container height
}
else
{
menuBar.Hide();
menuBarIsHide = true;
//manage container height
}
}
}
}
您可以覆盖ProcessCmdKey
以处理 Alt 键以切换菜单可见性。另外要激活菜单,请调用内部OnMenuKey
MenuStrip
方法。使用菜单完成工作后,还可以处理MenuDeactivate
以使菜单不可见,但您需要使用 BeginInvoke
使菜单不可见。
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
if (keyData == (Keys.Alt | Keys.Menu))
{
if (!this.menuStrip1.Visible)
{
this.menuStrip1.Visible = true;
var OnMenuKey = menuStrip1.GetType().GetMethod("OnMenuKey",
System.Reflection.BindingFlags.NonPublic |
System.Reflection.BindingFlags.Instance);
OnMenuKey.Invoke(this.menuStrip1, null);
}
else
{
this.menuStrip1.Visible = false;
}
return true;
}
return base.ProcessCmdKey(ref msg, keyData);
}
private void menuStrip1_MenuDeactivate(object sender, EventArgs e)
{
this.BeginInvoke(new Action(() => { this.menuStrip1.Visible = false; }));
}