C#:将派生类作为一个泛型参数传递

2024-02-13

我最近开始学习更多关于事件/代表以及课程扩展的知识。

我想通过添加一个内容来将我学到的知识付诸实践扩大调用 Windows 窗体控件的方法SetDraggable(),这又使用MouseDown and MouseMove移动控件的事件。

一切都很好,除了它只适用于特定控件的想法——在我的例子中,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;
            }
        }

    }
}

可以看出,我需要特定的控件才能调用鼠标事件——我无法从parent class System.Windows.Forms.

所以我的问题仍然是——是否有一个概念可以让程序员一般将所有派生类作为参数传递。我基本上试图避免为每个控件复制粘贴以下代码,并希望将其推广到派生自的所有类System.Windows.Forms.

据我所知,这个想法的主要缺陷是我ASSUMING所有派生类都会有我需要的事件;然而,由于类似的事情也存在于以下形式的函数中:代表们,我希望有人能够权衡涉及对象或参数的情况。


父类不是System.Windows.Forms,这只是命名空间。实际的父类是Control,你当然可以使用它:) 使用通用方法也是可能的,但并不是真正必要。

理想情况下,您还希望避免这些静态字段,因为可能有多个并发的可拖动对象;中的一个闭包SetControlDraggable方法会效果更好:

public static void SetControlDraggable(this Control control)
{
  Point mouseDownLocation = Point.Empty;

  control.MouseDown += (s, e) =>
    {
      if (e.Button == MouseButtons.Left) mouseDownLocation = e.Location;
    }
  control.MouseUp += (s, e) =>
    {
      if (e.Button == MouseButtons.Left)
      {
        control.Left = e.X + control.Left - mouseDownLocation.X;
        control.Top = e.Y + control.Top - mouseDownLocation.Y;
      }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C#:将派生类作为一个泛型参数传递 的相关文章

随机推荐