自动隐藏MenuStrip

时间:2016-06-01 21:23:48

标签: c# .net winforms

我正在开发一个Windows窗体项目,最近我添加了一些代码,默认情况下隐藏了MenuStrip,除非用户按下Alt键,以符合最新版本的Windows视觉实践。

我想要做的是通过启用MenuStrip自动隐藏是否在特定时间范围内未检测到活动来完成此添加。不用多说,这是我到目前为止编写的代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace SomeWinformProject {
    public partial class MainForm : Form {
        /* Construction */
        public MainForm () {
            InitializeComponent ();
            this.KeyDown += new KeyEventHandler(this.MainForm_KeyDown);
            this.KeyPreview = true;
            this.menuStrip.Visible = false;
        }

        /* Alt key event handler */
        private void MainForm_KeyDown (object sender, KeyEventArgs e) {
            /* if the Alt key is pressed and the menuStrip is not currently
             * visible, un-hide it */
             if (e.Alt && !(this.menuStrip.Visible))
                 this.menuStrip.Visible = true;
        }
    }
}

以下是我自己想到的解决这个问题的方法:

  1. 创建一个名为“menuStripActivity效果的公共布尔值,并将其设置为false中的MainForm_KeyDown()。然后,我考虑以5秒左右的间隔创建一个计时器实例,并将MouseClick事件附加到menuStrip。如果发生MouseClick事件,则menuStripActivity将设置为true,并且计时器中断将选择不执行任何操作,而不是隐藏MenuStrip。
  2. 我已经意识到存在的问题是,它没有考虑用户在过程中做某事或导航menuStrip选项的可能性。我在MSDN文档中读到了MouseHover事件处理程序也存在,在这种情况下,我可以在发生计时器跳闸时对两个处理程序的结果进行OR运算。
  3. 这两个问题都是我对C#和.NET生态系统都很陌生,所以我不知道什么是正确的,什么是kludgy。我想避免我的代码混乱,并希望在这种情况的“最佳实践”方面犯错误。

    任何人都可以帮我指出正确的方向(或向我展示我正在制作的错误)吗?

1 个答案:

答案 0 :(得分:1)

您可以收听MenuStrip.MenuDeactivate事件:

public MainForm () {
    InitializeComponent ();

    this.KeyPreview = true;
    this.KeyDown += new KeyEventHandler(this.MainForm_KeyDown);
    this.menuStrip.MenuDeactivate += (s, e) => this.menuStrip.Visible = false;

    this.menuStrip.Visible = false;
}
  

备注
  当通过ALT键激活时,MenuStrip或ToolStrip通常既不会从当前具有焦点的控件中获取也不会移除焦点。如果在MenuStrip中存在控件或MenuStrip下拉,则当用户按下TAB键时,控件将获得焦点。通常,当键盘激活MenuStrip的GotFocus,LostFocus,Enter和Leave事件时,可能不会引发它们。在这种情况下,请改用MenuActivate和MenuDeactivate事件。