С ES6 вы можете получить доступ к методам класса по имени:
class X {
method1(){
console.log("1");
}
method2(){
this['method1']();
console.log("2");
}
}
let x = new X();
x['method2']();
вывод будет:
1
2
После дополнительных исследований я обнаружил метод Application.AddMessageFilter . Используя это, я создал .NET-версию перехватчика мыши:
class MouseMessageFilter : IMessageFilter, IDisposable
{
public MouseMessageFilter()
{
}
public void Dispose()
{
StopFiltering();
}
#region IMessageFilter Members
public bool PreFilterMessage(ref Message m)
{
// Call the appropriate event
return false;
}
#endregion
#region Events
public class CancelMouseEventArgs : MouseEventArgs
{...}
public delegate void CancelMouseEventHandler(object source, CancelMouseEventArgs e);
public event CancelMouseEventHandler MouseMove;
public event CancelMouseEventHandler MouseDown;
public event CancelMouseEventHandler MouseUp;
public void StartFiltering()
{
StopFiltering();
Application.AddMessageFilter(this);
}
public void StopFiltering()
{
Application.RemoveMessageFilter(this);
}
}
Затем я могу обработать событие MouseMove в моем контейнерном элементе управления, проверить, находится ли мышь внутри моего родительского элемента управления, и начать работу. (Мне также пришлось отслеживать последний наведенный родительский элемент управления, чтобы я мог остановить ранее запущенный родительский элемент.)
---- Изменить ----
В моем классе формы я создаю и подключаю фильтр:
public class MyForm : Form
{
MouseMessageFilter msgFilter;
public MyForm()
{...
msgFilter = new MouseMessageFilter();
msgFilter.MouseDown += new MouseMessageFilter.CancelMouseEventHandler(msgFilter_MouseDown);
msgFilter.MouseMove += new MouseMessageFilter.CancelMouseEventHandler(msgFilter_MouseMove);
}
private void msgFilter_MouseMove(object source, MouseMessageFilter.CancelMouseEventArgs e)
{
if (CheckSomething(e.Control)
e.Cancel = true;
}
}
Вы можете узнать, находится ли мышь в пределах вашего элемента управления следующим образом (предполагая, что этот код находится в вашем элементе управления контейнера; если нет, замените this
ссылкой в элемент управления контейнера):
private void MyControl_MouseLeave(object sender, EventArgs e)
{
if (this.ClientRectangle.Contains(this.PointToClient(Cursor.Position)))
{
// the mouse is inside the control bounds
}
else
{
// the mouse is outside the control bounds
}
}
Я не думаю, что вам нужно подключать насос сообщений, чтобы решить эту проблему. Некоторые отметки в вашем пользовательском интерфейсе должны помочь. Я думаю, что вы создаете переменную-член, что-то вроде Control _someParent, в своем управляющем классе, который будет принимать ссылку на родительский элемент управления при вызове одного из ваших обработчиков OnMouseEnter. Затем в OnMouseLeave проверьте значение «флага» _someParent, и если оно такое же, как у текущего отправителя, не останавливайте обработку, а просто вернитесь. Вы останавливаете и сбрасываете _someParent на null, только если родительский элемент другой.