我正在处理一个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效果的公共布尔值,并将其设置为MainForm_KeyDown()中的false。然后,我考虑在大约5秒的时间间隔内创建一个计时器实例,并将一个MouseClick事件附加到menuStrip。如果发生了MouseClick事件,那么menuStripActivity将被设置为true,而计时器中断将选择什么都不做,而不是隐藏MenuStrip。menuStrip选项的可能性。我在MSDN文档中看到,也存在一个MouseHover事件处理程序,在这种情况下,当计时器跳转发生时,我可以或这两个处理程序的结果。这两个方面的问题是,我对C#和整个.NET生态系统相当陌生,所以我不太清楚什么是正确的,什么是疯狂的。我希望避免我的代码被杂乱无章地从出发,并希望错误的一方的“最佳实践”为这种情况。
有人能帮我指出正确的方向(或者指出我正在犯的错误)吗?
发布于 2016-06-01 22:04:33
您可以收听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键时,该控件将获得焦点。通常,当键盘激活GotFocus、LostFocus、Enter和Leave事件时,可能不会引发这些事件。在这种情况下,可以使用MenuActivate和MenuDeactivate事件。
https://stackoverflow.com/questions/37579022
复制相似问题