Autohide MenuStrip - 如何在显示时激活它?

时间:2017-03-16 07:37:17

标签: c# .net winforms menustrip

我有MenuStrip并使用以下代码将其设为AutoHide。它隐藏/显示完美但是当控件获得焦点时,通过按 Alt 键,MenuStrip显示但它不活动且快捷键下没有小的下划线,例如在'F'下对于File,按“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
            }
        }
    }
}

1 个答案:

答案 0 :(得分:1)

您可以覆盖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; }));
}