Я знаю, что немного опоздал с ударом, но сегодня у меня были проблемы с этим при использовании панели в качестве строки заголовка. У меня была метка для отображения текста, графического окна и нескольких кнопок, вложенных в панель, но мне все равно нужно было перехватывать событие 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);
Относительно прост в использовании, и я могу поручиться за то, что это работает :)
person
Jason Larke
schedule
03.07.2012