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
有关拖动效果的详细信息,请参阅 Data 和 AllowedEffect。