マウス コントロールなどを処理するカスタム イベントの作成に頭を悩ませようとしてきましたが、どのチュートリアルでも対処されていないように見える特定のエラーが発生し続けています。私の作成/割り当てのロジックは正しいと確信していますが、ここで見逃している根本的な問題があるかもしれません。
まず、メソッドと同じ署名でデリゲートを作成します。
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" には ohject 参照が必要です」というエラーが表示されます。
最後に、mouseDown でサブスクライブしようとしているメソッドを次に示します。
public void MouseDownEvent(object sender, MouseEventArgs e, Control control)
{
Dragging = true;
DragStart = new Point(e.X, e.Y);
control.Capture = true;
}
どこかで見つけたヘルパー クラスを変更しようとしても、おそらく役に立たないでしょう。さらに情報が必要な場合は、お気軽にお問い合わせください。
注: このクラスの主な目的は、実行時にコントロールを移動できるようにすることです。
編集:
最初の 2 つはうまくいったと思いますが、移動するには次の方法を使用する必要があります。
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すべてにサブスクライブした1つのメソッドを呼び出すだけでした. 提案されているように、別の方法でサブスクライブできるか、適切なコントロールを正しく渡す必要があるようです。つまり、コントロールとしての送信者ではありません。何か案は?
現在、どこからでもこのメソッドを実行して購読しています。
helper.Init(this.Controls["btn" + i]);
そして、ボタンをマウスアップ、ダウン、ムーブにサブスクライブする前に、これらのメソッドを実行します。
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);
}
};
}
注: 3 番目のサブスクリプションは、以前の状態です (匿名デリゲート)。ただし、イベントで正しいコントロールを渡す必要があると思います。これにより、問題がより明確になりますか?