拖放鼠标行为概述

Windows 窗体包括一组实现拖放行为的方法、事件和类。 本文概述了 Windows 窗体中的拖放支持。

拖放事件

拖放操作中有两类事件:在拖放操作的当前目标上发生的事件,以及在拖放操作源上发生的事件。 若要进行拖放操作,必须处理这些事件。 通过使用这些事件提供的事件参数信息,可以轻松促进拖放操作。

当前拖放目标上的事件

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

鼠标事件 DESCRIPTION
DragEnter 当对象被拖动到控件的边界中时,会发生此事件。 此事件的处理程序接收类型为 DragEventArgs的参数。
DragOver 当鼠标指针位于控件边界内时拖动对象时,将发生此事件。 此事件的处理程序接收类型为 DragEventArgs的参数。
DragDrop 拖放操作完成后发生此事件。 此事件的处理程序接收类型为 DragEventArgs的参数。
DragLeave 当对象被拖出控件的边界时,会发生此事件。 此事件的处理程序接收类型为 EventArgs的参数。

DragEventArgs 类提供鼠标指针的位置、鼠标按钮和键盘修饰键的当前状态、被拖动的数据,以及 DragDropEffects 指定拖动事件源允许的操作和针对该操作的目标放置效果的值。

拖放源的事件

以下表格展示了在拖放操作的源上发生的事件。

鼠标事件 DESCRIPTION
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

另请参阅