Я знаю, что немного опоздал на удар, но у меня были проблемы с этим ранее сегодня, когда я использовал Панель в качестве строки заголовка. У меня была метка для отображения некоторого текста, графическое окно и несколько кнопок, все они были вложены в Panel, но мне нужно было перехватывать событие MouseMove независимо от того.
Что я решил сделать, так это реализовать обработчик рекурсивных методов, поскольку у меня был только 1 уровень вложенных элементов управления, это может не очень хорошо масштабироваться, когда вы начинаете приближаться к смешным уровням вложенности.
Вот как я это сделал:
protected virtual void NestedControl_Mousemove(object sender, MouseEventArgs e)
{
Control current = sender as Control;
//you will need to edit this to identify the true parent of your top-level control. As I was writing a custom UserControl, "this" was my title-bar's parent.
if (current.Parent != this)
{
// Reconstruct the args to get a correct X/Y value.
// you can ignore this if you never need to get e.X/e.Y accurately.
MouseEventArgs newArgs = new MouseEventArgs
(
e.Button,
e.Clicks,
e.X + current.Location.X,
e.Y + current.Location.Y,
e.Delta
);
NestedControl_Mousemove(current.Parent, newArgs);
}
else
{
// My "true" MouseMove handler, called at last.
TitlebarMouseMove(current, e);
}
}
//helper method to basically just ensure all the child controls subscribe to the NestedControl_MouseMove event.
protected virtual void AddNestedMouseHandler(Control root, MouseEventHandler nestedHandler)
{
root.MouseMove += new MouseEventHandler(nestedHandler);
if (root.Controls.Count > 0)
foreach (Control c in root.Controls)
AddNestedMouseHandler(c, nestedHandler);
}
А затем настроить его относительно просто:
Определите ваш "истинный" обработчик:
protected virtual void TitlebarMouseMove(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
this.Text = string.Format("({0}, {1})", e.X, e.Y);
}
}
А затем настроить элементы управления подписчиками событий:
//pnlDisplay is my title bar panel.
AddNestedMouseHandler(pnlDisplay, NestedControl_Mousemove);
Относительно прост в использовании, и я могу ручаться за то, что он работает:)