0

我设计了以下代码,用于在鼠标悬停时显示控件的 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

4 回答 4

0

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

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

于 2009-12-17T06:56:40.503 回答
0

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

尝试添加:

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

在处理部分MenuItems

于 2009-12-17T06:59:17.610 回答
0

您的代码存在一些问题。

第一个。MenuStrip 的 Item 不是 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语句将失败(控件将为空)。做这样的事情:

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();

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

这应该让你继续前进。

于 2009-12-18T17:04:10.520 回答
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);
    }
  }
}
于 2009-12-19T04:11:07.090 回答