拖放鼠标行为概述(Windows 窗体 .NET)

Windows 窗体包含一组实现拖放行为的方法、事件和类。 本主题概述了 Windows 窗体对拖放功能的支持。

重要

面向 .NET 7 和 .NET 6 的桌面指南文档正在撰写中。

拖放事件

拖放操作中有两类事件:一类是拖放操作的当前目标上发生的事件,一类是拖放操作的源上发生的事件。 若要执行拖放操作,必须处理这些事件。 通过使用这些事件的事件参数中的可用信息,可以轻松地实现拖放操作。

当前拖放目标上的事件

下表显示在拖放操作的当前目标上发生的事件。

鼠标事件 说明
DragEnter 将对象拖入控件的边界时此事件发生。 此事件的处理程序接收类型为 DragEventArgs 的参数。
DragOver 在鼠标指针位于控件的边界内时如果拖动对象则此事件发生。 此事件的处理程序接收类型为 DragEventArgs 的参数。
DragDrop 拖放操作完成时此事件发生。 此事件的处理程序接收类型为 DragEventArgs 的参数。
DragLeave 将对象拖出控件的边界时此事件发生。 此事件的处理程序接收类型为 EventArgs 的参数。

DragEventArgs 类提供鼠标指针的位置、鼠标按钮和键盘修改键的当前状态、正在拖动的数据以及 DragDropEffects 值(指定拖动事件的源所允许的操作以及操作的目标放置效果)。

放置源上的事件

下表显示在拖放操作的源上发生的事件。

鼠标事件 说明
GiveFeedback 此事件在执行拖动操作期间发生。 借助此事件,可向用户提供可视提示(例如更改鼠标指针),通知拖放操作正在发生。 此事件的处理程序接收类型为 GiveFeedbackEventArgs 的参数。
QueryContinueDrag 此事件在拖放操作期间引发,并使拖动源可以确定是否应取消拖放操作。 此事件的处理程序接收类型为 QueryContinueDragEventArgs 的参数。

QueryContinueDragEventArgs 类提供鼠标按钮和键盘修改键的当前状态、指定是否按 ESC 键的值以及 DragAction 值(可设置为指定是否应继续拖放操作)。

执行拖放操作

拖放操作始终涉及两个组件 - 放置源和拖放目标。 若要启动拖放操作,请指定一个控件作为源,并处理 MouseDown 事件。 在事件处理程序中,调用 DoDragDrop 方法,该方法提供与放置关联的数据和 DragDropEffects 值。

将目标控件的 AllowDrop 属性设置为 true,以允许该控件接受拖放操作。 目标处理两个事件,第一个是响应控件上的拖动的事件,如 DragOver。 第二个事件是放置操作本身 - DragDrop

下面的示例演示一个从 Label 控件到 TextBox 的拖动操作。 拖动操作完成后,TextBox 通过将标签的文本分配给其自身来做出响应。

// Initiate the drag
private void label1_MouseDown(object sender, MouseEventArgs e) =>
    DoDragDrop(((Label)sender).Text, DragDropEffects.All);

// Set the effect filter and allow the drop on this control
private void textBox1_DragOver(object sender, DragEventArgs e) =>
    e.Effect = DragDropEffects.All;

// React to the drop on this control
private void textBox1_DragDrop(object sender, DragEventArgs e) =>
    textBox1.Text = (string)e.Data.GetData(typeof(string));
' Initiate the drag
Private Sub Label1_MouseDown(sender As Object, e As MouseEventArgs)
    DoDragDrop(DirectCast(sender, Label).Text, DragDropEffects.All)
End Sub

' Set the effect filter and allow the drop on this control
Private Sub TextBox1_DragOver(sender As Object, e As DragEventArgs)
    e.Effect = DragDropEffects.All
End Sub

' React to the drop on this control
Private Sub TextBox1_DragDrop(sender As Object, e As DragEventArgs)
    TextBox1.Text = e.Data.GetData(GetType(String))
End Sub

有关拖动效果的详细信息,请参阅DataAllowedEffect

另请参阅