我一直在尝试创建一个自定义事件来处理鼠标控件等,但我一直遇到一些教程似乎都没有解决的错误。我很确定我的创建/分配逻辑是正确的,但也许我在这里遗漏了一些根本错误的东西。
首先,我使用与方法相同的签名创建我的委托;
public delegate void MouseDown(object sender, MouseEventArgs e, Control control);
然后我将它分配给我的事件;
public event MouseDown OnMouseDown;
最后我尝试订阅该活动;
public static void Init(Control control, Control container, Direction direction)
{
control.MouseDown += OnMouseDown;
}
//ignore the parameters I'm passing, these are out of the scope of my problem.
但是,在本节中,我收到错误“非静态字段、方法或属性“blah blah.OnMouseDown”需要对象引用”
最后,这是我尝试在 mouseDown 上订阅的方法;
public void MouseDownEvent(object sender, MouseEventArgs e, Control control)
{
Dragging = true;
DragStart = new Point(e.X, e.Y);
control.Capture = true;
}
我试图修改我在某处找到的帮助程序类可能无济于事。如果需要任何进一步的信息,请随时询问。
注意:此类的主要目标是允许在运行时移动控件。
编辑:
我相信前两个已经奏效,但要移动我需要使用以下方法;
public void MouseMoveEvent(object sender, MouseEventArgs e, Control control, Control container, Direction direction)
{
if (Dragging)
{
if (direction != Direction.Vertical)
container.Left = Math.Max(0, e.X + container.Left - DragStart.X);
if (direction != Direction.Horizontal)
container.Top = Math.Max(0, e.Y + container.Top - DragStart.Y);
}
}
所以我需要发送方向方向,我不能作为发件人发送。我对整个系统进行这些更改的原因是,我在使用匿名委托之前让它工作,但是当我想重新锁定控件时,这些被证明很难取消订阅。
编辑 2:
从头开始,如果我没有通过正确的控制,mouseDown 和 mouseUp 将不起作用,至少订阅我以前做的方式。我可以试试你的方法,但是,我这样做的方式只是调用一个订阅所有 3 个 MouseControls 的方法。看起来我可以按照建议订阅单独的方法,或者我需要正确传递正确的控件,即不是发送者作为控件。有任何想法吗?
目前我正在通过从任何地方运行此方法进行订阅;
helper.Init(this.Controls["btn" + i]);
然后在将按钮订阅到我的 mouseup、down 和 move 之前,它会运行这些方法。
public static void Init(Control control)
{
Init(control, Direction.Any);
}
public static void Init(Control control, Direction direction)
{
Init(control, control, direction);
}
public static void Init(Control control, Control container, Direction direction)
{
control.MouseDown += new MouseEventHandler(FireOnMouseDown);
control.MouseUp += new MouseEventHandler(FireOnMouseUp);
control.MouseMove += delegate(object sender, MouseEventArgs e)
{
if (Dragging)
{
if (direction != Direction.Vertical)
container.Left = Math.Max(0, e.X + container.Left - DragStart.X);
if (direction != Direction.Horizontal)
container.Top = Math.Max(0, e.Y + container.Top - DragStart.Y);
}
};
}
注意:第三次订阅是他们之前的样子(匿名代表)。我相信我需要在事件中通过正确的控制。这是否让我的问题更加清晰?