У меня есть 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
Это возможно?
Думаю, да. Хороший инструмент для проверки событий вашего приложения WinForms.
http://missico.spaces.live.com/blog/cns!7178D2C79BA0A7E3!186.entry
Мышь «покидает» панель при входе в дочерний элемент управления, поэтому запускает событие.
Вы можете добавить что-то вроде следующих строк в обработчик событий панели 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
}
Это непростой вопрос, и его будет сложно надежно запрограммировать. Одна из идей состоит в том, чтобы «захватить» 3 входящих события в список и выполнить желаемый код после того, как список будет заполнен (в списке есть 3 желаемых события). Затем, когда вы закончите выполнение любого кода (или, возможно, захватите комбинацию событий в обратном порядке), вы можете очистить свой список и подготовить его к следующему разу, когда произойдет это конкретное комбо-событие. Не идеально, но просто мысль.
Конечно, это не решает потенциальных проблем решения и возможных пропущенных событий, о которых говорил Ханс. Возможно, потребуется больше контекста.
Возможно, это не самое элегантное решение, но вы можете установить свойство в родительской панели управления (подкласс панели), которое является значением 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;
}
Ни то, ни другое не является элегантным, но это будет работать.