我正在开发一个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;
}
}
}
以下是我自己想到的解决这个问题的方法:
menuStripActivity
效果的公共布尔值,并将其设置为false
中的MainForm_KeyDown()
。然后,我考虑以5秒左右的间隔创建一个计时器实例,并将MouseClick事件附加到menuStrip
。如果发生MouseClick事件,则menuStripActivity
将设置为true
,并且计时器中断将选择不执行任何操作,而不是隐藏MenuStrip。menuStrip
选项的可能性。我在MSDN文档中读到了MouseHover
事件处理程序也存在,在这种情况下,我可以在发生计时器跳闸时对两个处理程序的结果进行OR运算。 这两个问题都是我对C#和.NET生态系统都很陌生,所以我不知道什么是正确的,什么是kludgy。我想避免我的代码混乱,并希望在这种情况的“最佳实践”方面犯错误。
任何人都可以帮我指出正确的方向(或向我展示我正在制作的错误)吗?
答案 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事件。