【问题标题】:WinForms Drag-and-Drop: Labels "jump away" before following mouseWinForms拖放:标签在跟随鼠标之前“跳开”
【发布时间】:2026-02-09 05:40:01
【问题描述】:

如果这是一个愚蠢的问题,请原谅我,但我没有经验,也没有找到这个问题的答案。

根据存储在数据表 (treedata) 中的数据,我在代码中的面板 (Form8.Panel1) 上放置标签:

    For i = 0 To _tree.treedata.Rows.Count - 1

        Dim tb As New Label

        tb.Name = CStr(i)

        tb.AutoSize = True
        tb.MaximumSize = New Size(tb.Width, 70)
        tb.MinimumSize = New Size(tb.Width, 0)

        tb.Location = New Point(treedata.Rows(i)(11),treedata.Rows(i)(4))

        AddHandler tb.MouseMove, AddressOf obj1_MouseMove
        AddHandler tb.MouseDown, AddressOf obj1_MouseDown

        Form8.Panel1.Controls.Add(tb)

    Next

使用 MouseMove 事件,我想跟随鼠标在面板上拖动标签:

Private Sub obj1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)

    If e.Button = MouseButtons.Left Then
        sender.Location = New Point(Form8.MousePosition.X, Form8.MousePosition.Y)

    End If
End Sub

现在发生的情况是,当我单击一个标签并希望它跟随鼠标时,它首先“跳开”,意思是从鼠标的位置移动了很多,然后才跟随鼠标。有谁知道我必须改变什么才能避免标签的这种初始跳跃?

【问题讨论】:

  • MousePosition 不是您想要的,您需要将这些坐标转换为控制坐标。
  • 类似这样的东西:*.com/questions/28531058/…。关于PointToClient 的部分可能是最相关的。

标签: vb.net winforms drag-and-drop


【解决方案1】:

结果很简单,只是 MousePosition 没有给出相对于面板的位置。这有效:

        Dim newloc As Point = Form8.Panel1.PointToClient(Form8.MousePosition)
        sender.Location = newloc

【讨论】:

  • 不幸的是,VB.NET 编译器允许这样做,实际上最好使用正确的标识符名称。是Control.MousePosition,更明显的是PointToClient是必需的,它返回的位置与表单坐标无关。
最近更新 更多