在鼠标hover上设置状态栏文本 – 适用于控件但不适用于MenuItems

我设计了以下代码,用于在鼠标hover时显示控件的Tag属性。 该代码适用于标签控件,如标签和TextBoxes,但我不能让它适用于我的MenuItems(更具体地说是ToolStripMenuItems)。 你们可以看看我的代码并告诉我我做错了什么吗? 提前致谢!

public void Form1_Load(object sender, EventArgs e) 

{

...

this.addEventsToAllComponents(this);

}

  private void addEventsToAllComponents(Component component) { if (component is MenuItem) { MenuItem menuItem = component as MenuItem; menuItem.Select += new EventHandler(menuItem_Select); } else if (component is Control) { Control ctrl = component as Control; foreach (Control control in ctrl.Controls) { control.MouseEnter += new EventHandler(this.control_MouseEnter); control.MouseLeave += new EventHandler(this.control_MouseLeave); if (control.HasChildren) addEventsToAllComponents(control); } } } private void menuItem_Select(object sender, EventArgs e) { MenuItem menuItem = sender as MenuItem; if (menuItem.Tag.ToString().Length > 0) this.toolStripStatusLabel1.Text = menuItem.Tag.ToString(); } private void control_MouseEnter(object sender, EventArgs e) { Control control = sender as Control; if (control.Tag.ToString().Length > 0) this.toolStripStatusLabel1.Text = control.Tag.ToString(); } private void control_MouseLeave(object sender, EventArgs e) { if (this.toolStripStatusLabel1.Text.ToString().Length > 0) this.toolStripStatusLabel1.Text = ""; } 

您的代码存在一些问题。

1。 MenuStrip的项目不是Item的子项,因此HasChildren将返回false。 相反,它们位于MenuStrip的Items集合中。 您需要专门处理MenuStrip事件。 在下面的AddEvents …方法中添加以下代码:

 (snip...) // old code if (control.HasChildren) AddEventsToAllControls(control); //add new code below if (control is MenuStrip) { MenuStrip ms = control as MenuStrip; AddEventsToAllToolStripMenuitems(ms.Items); } 

并添加新方法如下:

 private void AddEventsToAllToolStripMenuitems (ToolStripItemCollection items) { foreach (ToolStripItem tsi in items) { tsi.MouseEnter += new EventHandler(this.control_MouseEnter); tsi.MouseLeave += new EventHandler(this.control_MouseLeave); if (tsi is ToolStripMenuItem) { ToolStripMenuItem mi = tsi as ToolStripMenuItem; AddEventsToAllToolStripMenuitems(mi.DropDownItems); } } } 

第2位。 ToolStripItem不派生自Control,因此在MouseEnter中, 发送者作为Control语句将失败(控件将为null)。 做这样的事情:

 Control control = sender as Control; if (control != null && control.Tag != null && control.Tag.ToString().Length > 0) this.toolStripStatusLabel1.Text = control.Tag.ToString(); ToolStripItem tsi = sender as ToolStripItem; if (tsi != null && tsi.Tag != null && tsi.Tag.ToString().Length > 0) this.toolStripStatusLabel1.Text = tsi.Tag.ToString(); 

(我还添加了一些空检查)

这应该让你去。

您没有任何代码来处理ToolStripMenuItems – 它们不是从MenuItems派生的,因此您的MenuItem处理代码不会为它们做任何事情。

旁白:为了便于阅读,您可能希望使用string.IsNullOrEmpty(menuItem.Tag.ToString())来测试空/空字符串。

您没有为包含其他菜单项的MenuItems设置递归。 因此,当它找到一个menuitem时,它只会添加顶级MenuItem ,而不是它的子项。

尝试添加:

 foreach (MenuItem item in menuItem.MenuItems) { item Select += new EventHandler(menuItem_Select); if (item.IsParent) addEventsToAllComponents(item); } 

在处理MenuItems的部分中。

以下是AddEventsToAllComponents方法的修订代码:

 private void addEventsToAllControls(Control ctrl) { foreach (Control control in ctrl.Controls) { control.MouseEnter += new EventHandler(this.control_MouseEnter); control.MouseLeave += new EventHandler(this.control_MouseLeave); if (control.HasChildren) addEventsToAllControls(control); if (control is MenuStrip) { MenuStrip ms = control as MenuStrip; AddEventsToAllToolStripItems(ms.Items); } else if (control is ToolStrip) { ToolStrip ts = control as ToolStrip; AddEventsToAllToolStripItems(ts.Items); } } }