Задать текст строки состояния при наведении мыши - работает для элементов управления, но не для элементов меню - PullRequest
0 голосов
/ 17 декабря 2009

Я разработал следующий код для отображения свойства тега элемента управления при наведении мыши. Код прекрасно работает для стандартных элементов управления, таких как Labels и 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 = "";
}

Ответы [ 4 ]

0 голосов
/ 19 декабря 2009

Вот пересмотренный код для метода 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);
    }
  }
}
0 голосов
/ 17 декабря 2009

У вас нет настроенной рекурсии для MenuItems, содержащей другие пункты меню. Поэтому, когда он найдет пункт меню, он добавит только верхний уровень MenuItem, а не его детей.

попробуйте добавить:

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

в разделе для обработки MenuItems.

0 голосов
/ 18 декабря 2009

Есть несколько проблем с вашим кодом.

первый. Элементы MenuStrip не являются дочерними для Item, поэтому HasChildren вернет false. Вместо этого они находятся в коллекции Items в MenuStrip. Вам нужно специально обработать вхождение 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 отправитель как оператор Control завершится ошибкой (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();

(я также добавил несколько нулевых проверок)

Это должно помочь вам.

0 голосов
/ 17 декабря 2009

У вас нет кода для обработки ToolStripMenuItems - они не являются производными от MenuItems, поэтому ваш код обработки MenuItem ничего для них не сделает.

В сторону: для удобства чтения вы можете использовать string.IsNullOrEmpty(menuItem.Tag.ToString()) для проверки пустых / пустых строк.

...