Autohide MenuStrip - 如何在显示时激活它?
问题描述:
我有一个MenuStrip
,我使用下面的代码使之AutoHide
。它隐藏/显示知府但是当一个控制获得焦点,按Alt键键,MenuStrip
节目,但它不活跃,没有下下“F”文件的快捷键,例如小下划线,并按下“F”会不打开它)。我如何正确地激活它?Autohide MenuStrip - 如何在显示时激活它?
注:我用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键键切换菜单的知名度。也要激活菜单,请致电MenuStrip
的内部OnMenuKey
方法。也处理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; }));
}
让我知道如果您有任何关于应用该解决方案的问题。请记住,开始时应将'MenuStrip'的'Visible'属性设置为'false'。这是我知道的最稳定的自动隐藏菜单。 –
感谢您的回复,但存在问题。如果用户按住'Alt'键'menuStrip'就会快速打开和关闭。我应该如何解决这个问题? – NokhodSiah
不客气@NokhodSiah处理关键事件时,它的默认行为。我会检查它,如果我有任何问题,我会分享一个解决方案:) –