覆盖 vb.net 中继承的事件和参数

Overriding inherited events & arguments in vb.net

我创建了一个继承 PictureBox 控件的自定义控件。当新的 CustomControl 添加到 TestApp 时,我想向 returned 的 MouseMove 事件添加一些额外的数据。目前引发的事件将在 TestApp 中显示为

Private Sub MyCustomControl_MouseMove(sender as object, 
      e as MouseEventArgs) handles MyCustomControl.MouseMove

我的第一个想法是添加额外的参数,例如

Private Sub MyCustomControl_MouseMove(sender as object, 
      e as MouseEventArgs, MyExtraArgument as double) handles MyCustomControl.MouseMove

或者作为替代方案,将我的额外参数添加到 MouseEventArgs class,这样它就会显示为

e.MyExtraArgument

这两种方法都可行吗?我的印象是,如果不能修改父控件的原始源代码,这些 events/objects 可能不会被覆盖。是否有任何使用这些技术的示例?理想情况下,我想将所有代码保留在我新创建的控件库中,这样 TestApp 除了将新创建的子控件放入其中之外不需要任何其他东西。

更多信息.... 我会详细说明一点......额外参数的原因是我已经实现了一个自动缩放,自动翻译笛卡尔坐标系到继承的图片框,而不使用矩阵和 GDI 固有的缩放方法。为了使新的图片框控件易于访问,我希望将 return X/Y 的现有事件覆盖为整数,允许它们 return 双精度或小数。在这种情况下,扩展 MouseEventArgs 似乎更好。

很难想象 MouseEventArgs 缺少什么需要扩展它。但是有几个问题:

  • 您不能只添加第三个参数,因为 MouseMove 事件签名不允许。
  • 您可以子 class 和扩展 MouseEventArgs 添加您的第三个参数,但您不能在标准 MouseMove 事件中使用它,因为事件签名不允许它。

可以使用标准 MouseMove 事件,并使用扩展事件参数 class 引发新的自定义事件。但这只会阻止旧事件触发,而不会显示为可用事件。这会让每个人都感到困惑,并使事件看起来像是失败了。

您可以响应标准 MouseMove 并提出允许两者同时存在的附加事件:

继承控制

Public Event MouseMoved(sender As Object, e As MouseMovedEventArgs)

Public Class MouseMovedEventArgs : Inherits MouseEventArgs

    Public Property NewProperty As Double

    Public Sub New(btns As MouseButtons, clicks As Integer,
                   x As Integer, y As Integer, delta As Integer,
                   newThing As Double)

        MyBase.New(btns, clicks, x, y, delta)
        NewProperty = newThing

    End Sub
End Class

Protected Overrides Sub OnMouseMove(e As MouseEventArgs)
    MyBase.OnMouseMove(e)

    RaiseEvent MouseMoved(Me, New MouseMovedEventArgs(e.Button, 
                                e.Clicks, e.X, e.Y, e.Delta, 3.14R))
End Sub

有两个非常相似的事件不会减少用户的混淆;一不小心就容易订阅错了

总的来说,我怀疑这是一个 XY 问题,通过添加与 MyExtraArgument 表示的任何信息直接相关的事件比尝试将更多信息压缩到现有事件中更容易解决。


I wished to override the existing events that return X/Y as integers, permitting them to return doubles or decimals.

我不明白这是怎么回事,鼠标移动相关。如果你确实消费了 MouseMove,用户将无法再获得相对于控件的坐标,只能缩放到图像。

那么,MouseClick 会发生什么?你要replace/override/mirror所有的鼠标事件吗?当用户在鼠标事件之外需要该信息时会发生什么?

更好的方法可能是提供一些 to/from 转换器。

Public Property Scale As Single      ' eg 0.15 to 1.95

Public Function ConvertToScale(pt As Point) As PointF
    ' pt == mouse loc from Click event or whatever
    '        relative to the control
    ' Returns the point relative to the image

Public Function ConvertFromScale(ptF As PointF) As Point
    ' does the reverse

现在,在任何时候,使用该控件的代码都可以在需要时转换或获取 (X, Y) 位置。顺便说一句 Single 应该足够了,可以防止你重新发明轮子。