События MouseEnter и MouseLeave от Панели и ее дочерних элементов управления

У меня есть a Panel это содержит дочерние элементы управления.

Если я обрабатываю Panel MouseEnter и MouseLeave события, и его ребенок MouseEnter и MouseLeave события, события генерируются в этом порядке:

Panel.MouseEnter
Panel.MouseLeave
Child1.MouseEnter
Child1.MouseLeave
Panel.MouseEnter
Panel.MouseLeave

Но мне нужен следующий заказ:

Panel.MouseEnter
Child1.MouseEnter
Child1.MouseLeave
Panel.MouseLeave

Это возможно?

13
задан Draken 9 May 2017 в 06:30
поделиться

4 ответа

Думаю, да. Хороший инструмент для проверки событий вашего приложения WinForms.

Windows.Forms Порядок событий

http://missico.spaces.live.com/blog/cns!7178D2C79BA0A7E3!186.entry

  • Создано с помощью EventSpy, написано Урсом Эйхманном. ( ftp://missico.net/EventSpy.zip )
  • Использование .NET Framework 3.5 и с включенной Visual Basic Application Framework.
0
ответ дан 1 December 2019 в 19:39
поделиться

Мышь «покидает» панель при входе в дочерний элемент управления, поэтому запускает событие.

Вы можете добавить что-то вроде следующих строк в обработчик событий панели MouseLeave :

// Check if really leaving the panel
if (Cursor.Position.X < Location.X ||
    Cursor.Position.Y < Location.Y ||
    Cursor.Position.X > Location.X + Width - 1 ||
    Cursor.Position.Y > Location.Y + Height - 1)
{
    // Do the panel mouse leave code
}
5
ответ дан 1 December 2019 в 19:39
поделиться

Это непростой вопрос, и его будет сложно надежно запрограммировать. Одна из идей состоит в том, чтобы «захватить» 3 входящих события в список и выполнить желаемый код после того, как список будет заполнен (в списке есть 3 желаемых события). Затем, когда вы закончите выполнение любого кода (или, возможно, захватите комбинацию событий в обратном порядке), вы можете очистить свой список и подготовить его к следующему разу, когда произойдет это конкретное комбо-событие. Не идеально, но просто мысль.

Конечно, это не решает потенциальных проблем решения и возможных пропущенных событий, о которых говорил Ханс. Возможно, потребуется больше контекста.

0
ответ дан 1 December 2019 в 19:39
поделиться

Возможно, это не самое элегантное решение, но вы можете установить свойство в родительской панели управления (подкласс панели), которое является значением bool, например "bool selected". Затем, когда срабатывает MouseEnter для панели, установить его в true... затем остановить логику mouseleave от срабатывания, если оно не установлено в false.

пример

bool selected;

MouseEnter(..,..)
{
 if (!selected)
   selected = true;
 else
   selected = false;

  if (selected)
   /.. Logic Here ../
}

MouseLeave()
{
  if (selected)
   return;

/.. Logic Here ../
}

В реальности я бы просто заставил событие MouseLeave дочерней панели устанавливать параметр.

Example:

Parent:
  bool doLeave;

  MouseLeave(..,..)
  {
    if (doLeave)
    {
     /.. Logic ../
     doLeave = false;
  }

Child:
 MouseLeave(..., ...)
  {
    DerivedPanel parent = this.Parent as DerivedPanel;
    if (parent != null)
      parent.doLeave = true;
  }

Ни то, ни другое не является элегантным, но это будет работать.

1
ответ дан 1 December 2019 в 19:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: