2015-12-10 11 views
1

Я использовал этот код для реализации на парении tooltip, он работает с TextBox, ComboBox, MaskedTextBox но не на NumericUpDown. Кто-нибудь знает, почему он не работает?NumericUpDown не меняется ToolStripStatusLabel когда MouseEnter

public static void addHovertip(ToolStripStatusLabel lb, Control c, string tip) 
     { 

      c.MouseEnter += (sender, e) => 
      { 
       lb.Text = tip; 
       // MessageBox.Show(c.Name); 
      }; 
      c.MouseLeave += (sender, e) => 
      { 
       lb.Text = ""; 

      }; 
     } 

ответ

1

Я признаю, что удаленный ответ от Hans Passant немного помог в создании этого ответа.

Прежде всего, ваш код работает нормально. Если вы работаете с событиями, которые происходят довольно часто (например, MouseEvents), вы должны добавить Debug.WriteLine в свой код, чтобы вы могли видеть в окне вывода отладчика события, для которых элементы управления, в каком порядке.

Основная проблема заключается в том, что из-за того, что числовой элемент управления вверх/вниз является элементом управления, состоящим из двух разных дочерних элементов управления, ваше событие MouseLeave вызывается, как только мышь входит в один из двух дочерних элементов управления. Что происходит: MouseEnter вызывается, когда мышь попадает на границу одной строки элемента управления, а MouseLeave называется моментом, когда мышь больше не находится на этой линии. В MouseLeave вы устанавливаете Label в строку emtpy. Это создает впечатление, что ваш код не работает.

Просто добавив цикл, чтобы перейти через любые дочерние элементы управления, эта проблема решается. Это по-прежнему часто устанавливает ярлык в пустую строку, но при необходимости сразу же устанавливается правильный текст.

Вот измененный код с инструкциями Debug на месте.

public static void addHovertip(ToolStripStatusLabel lb, Control c, string tip) 
    { 
     c.MouseEnter += (sender, e) => 
     { 
      Debug.WriteLine(String.Format("enter {0}", c)); 
      lb.Text = tip; 
     }; 

     c.MouseLeave += (sender, e) => 
     { 
      Debug.WriteLine(String.Format("Leave {0}", c)); 
      lb.Text = ""; 
     }; 

     // iterate over any child controls 
     foreach(Control child in c.Controls) 
     { 
      // and add the hover tip on 
      // those childs as well 
      addHovertip(lb, child, tip); 
     } 
    } 

Для полноты здесь это событие Load моей тестовой формы:

private void Form1_Load(object sender, EventArgs e) 
{ 
    addHovertip((ToolStripStatusLabel) statusStrip1.Items[0], this.numericUpDown1, "fubar"); 
} 

Вот анимированный GIF демонстрирует, что происходит, когда вы перемещаете мышь внутри и вне контроля Числовой Up Down:

numeric up down control and mouse event debug output

+0

спасибо, работает как шарм :) – someone