【问题标题】:Problems allowing custom UserControl to be dragged between panels允许在面板之间拖动自定义 UserControl 的问题
【发布时间】:2015-08-10 19:43:26
【问题描述】:

在我的程序中,我有一组自定义用户控件,它们都嵌套在可滚动面板内。目前,我有this code 允许我在其当前面板 拖动和移动控件。我想要的是能够将它们拖到另一个面板(在同一个表单中),以便用户可以创建控件的可视化组织。然后计划存储他们的位置(相对于面板)并使用它来创建时间表。

我的问题是,每当我开始拖动控件时,它们所在的面板就会调整大小,并且控件永远不会移动到另一个面板。

我尝试在目标面板中将AllowDrop 设置为True,并且我尝试重置您当前拖动到新面板的控件的父级。

感谢任何帮助!

【问题讨论】:

  • 要在容器之间移动,您需要向类中添加代码,当到达原始容器的边界时,该代码将在容器之间移动控件。此外,在我简短地尝试审查这一点时,我对您提供的代码有各种问题。我可以告诉您为什么要调整面板的大小,因为您的代码会通过 Container.Left 和 Container.Top 值更改来告诉它。这几乎就像您不允许移动控件,只是在窗体上移动它的父级,模拟控件的移动。
  • 确实...您只是在使用该代码“模拟”拖放。您应该使用内置的 .Net 拖放功能实现 实际 拖放代码。如果您需要它看起来像控件本身正在被拖动,您可以在启动拖动时从 UserControl 本身创建一个动态图标。做一些研究...

标签: vb.net user-controls drag-and-drop panel


【解决方案1】:

对此进行了更多挖掘,您想要的非常可行,但您需要承担一些繁重的工作。我在这里包含一个简短的示例,以帮助您入门。请记住,在处理控件的拖放时,这不考虑父容器,因此您需要添加它,以及在拖动时重新设置父容器的边缘检测。

Form1.vb:

Imports System
Imports System.Windows.Forms

Public Class Form1
    Dim _dragging As Boolean
    Dim _startX As Integer
    Dim _startY As Integer

    Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load

        For Each ctl As Control In Controls
            AddHandler ctl.MouseDown, AddressOf StartDrag
            AddHandler ctl.MouseMove, AddressOf WhileDragging
            AddHandler ctl.MouseUp, AddressOf EndDrag
        Next
        For Each ctl As Control In Controls
            For Each item In My.Settings.controlLocations
                If Split(item, "!")(0) = ctl.Name Then
                    ctl.Location = New Point(Split(item, "!")(1), Split(item, "!")(2))
                End If
            Next
        Next
    End Sub

    Private Sub StartDrag(ByVal sender As Object, ByVal e As MouseEventArgs)
        _dragging = True
        _startX = e.X
        _startY = e.Y
    End Sub

    Private Sub WhileDragging(ByVal sender As Object, ByVal e As MouseEventArgs)
        If _dragging = True Then
            sender.Location = New Point(sender.Location.X + e.X - _startX, sender.Location.Y + e.Y - _startY)
            Refresh()
        End If
    End Sub

    Private Sub EndDrag(ByVal sender As Object, ByVal e As EventArgs)
        _dragging = False
        My.Settings.controlLocations.Clear()
        For Each ctl As Control In Controls
            My.Settings.controlLocations.Add(ctl.Name & "!" & ctl.Location.X & "!" & ctl.Location.Y)
        Next
        My.Settings.Save()

    End Sub
End Class

【讨论】:

  • 感谢您的帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-25
  • 2013-06-02
  • 1970-01-01
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
相关资源
最近更新 更多