在鼠标悬停上设置状态栏文本 - 适用于控件但不适用于MenuItems

时间:2009-12-17 06:44:31

标签: c# winforms mouse hover menuitem

我设计了以下代码,用于在鼠标悬停时显示控件的Tag属性。该代码适用于标签控件,如标签和文本框,但我不能让它适用于我的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 = "";
}

4 个答案:

答案 0 :(得分:0)

您没有任何代码可以处理ToolStripMenuItems - 它们不是来自MenuItems,因此您的MenuItem处理代码不会为它们做任何事情。

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

答案 1 :(得分:0)

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

尝试添加:

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

在处理MenuItems的部分。

答案 2 :(得分:0)

您的代码存在一些问题。

第一。 MenuStrip的Items不是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);
        }
    }
}

第二。 ToolStripItem不是从Control派生的,因此在MouseEnter中, sender as 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();

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

这应该让你去。

答案 3 :(得分:0)

以下是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);
    }
  }
}