最近、クラスの拡張機能と組み合わせてイベント/デリゲートの詳細を学び始めました。C#:派生クラスを1つの汎用パラメータとして渡す
私は順番に制御を動き回ることMouseDown
とMouseMove
イベントを使用していますSetDraggable()
と呼ばれるWindowsフォームコントロールに拡張方法を、追加することによって、実際に学んだことを置くことを望んでいました。
すべてが問題なく動作しますが、特定のコントロール(私の場合はButton
)にのみ適用されます。図から分かるように
namespace Form_Extensions
{
public static class Extensions
{
private static System.Windows.Forms.Button StubButton;
private static Point MouseDownLocation;
public static void SetDraggable(this System.Windows.Forms.Button b)
{
b.MouseDown += b_MouseDown;
b.MouseMove += b_MouseMove;
StubButton = b;
}
private static void b_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{
if (e.Button == System.Windows.Forms.MouseButtons.Left)
{
MouseDownLocation = e.Location;
}
}
static void b_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
{
if (e.Button == System.Windows.Forms.MouseButtons.Left)
{
StubButton.Left = e.X + StubButton.Left - MouseDownLocation.X;
StubButton.Top = e.Y + StubButton.Top - MouseDownLocation.Y;
}
}
}
}
、私はマウスイベントを呼び出すために具体的な制御を必要とする - 私は親クラスSystem.Windows.Forms
からこれらのイベントにアクセスすることはできません。
私の質問は残っています。プログラマがに総ての派生クラスを引数として渡すことを許可するコンセプトはありますか。私は基本的にすべての単一のコントロールの下のコードを貼り付けるのを避けようとしており、System.Windows.Forms
から派生したすべてのクラスに対してそれを一般化したいと思います。
私が知る限り、そのアイデアの主な欠陥は、私がと書いていることです。を援助します。派生クラスはすべて私が必要とするイベントを持ちます。しかし、同様のことが関数の代理人の形で存在するので、私は、オブジェクトやパラメータを含む場合に誰かが体重を増やすことを望んでいました。ここでは、ジェネリック医薬品のための必要はあり
public static class Extensions
{
private static System.Windows.Forms.Control StubButton;
private static Point MouseDownLocation;
public static void SetControlDraggable(this System.Windows.Forms.Control b)
{
b.MouseDown += b_MouseDown;
b.MouseMove += b_MouseMove;
StubButton = b;
}
public static void SetDraggable<T>(this T b)
where T:System.Windows.Forms.Control
{
b.MouseDown += b_MouseDown;
b.MouseMove += b_MouseMove;
StubButton = b;
}
private static void b_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{
if (e.Button == System.Windows.Forms.MouseButtons.Left)
{
MouseDownLocation = e.Location;
}
}
private static void b_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
{
if (e.Button == System.Windows.Forms.MouseButtons.Left)
{
StubButton.Left = e.X + StubButton.Left - MouseDownLocation.X;
StubButton.Top = e.Y + StubButton.Top - MouseDownLocation.Y;
}
}
}
についてもっと知ります名前空間。親クラスは 'Control'であり、あなたは確かにそれを使うことができます:)ジェネリックメソッドを使うことも可能ですが、実際には必要ありません。理想的には、これらの静的フィールドを避けたい場合もあります。複数の並行ドラッグを持つことが可能であるためです。 'SetControlDraggable'メソッドのクロージャーはもっと良く機能します。または、単に 'sender'を使うと、それは本当にそれが何であるのかです。 – Luaan