若要在基于 Windows 的应用程序中执行拖放操作,必须处理一系列事件,尤其是DragEnter、DragLeave和DragDrop事件。 通过使用这些事件提供的事件参数信息,可以轻松促进拖放操作。
拖动数据
所有拖放操作都从拖动开始。 DoDragDrop 方法中实现了在拖动开始时收集数据的功能。
在下面的示例中,MouseDown 事件用于启动拖动操作,因为这样做最直观(大多数拖放动作是从鼠标按钮按下开始的)。 但是,请记住,任何事件都可用于启动拖放过程。
启动拖动操作
在控件开始拖动的MouseDown事件中,请使用
DoDragDrop
方法设置要拖动的数据以及允许拖动的效果。 有关详细信息,请参阅 Data 和 AllowedEffect。以下示例演示如何初始化拖动操作。 拖动开始处的控件是控件 Button ,所拖动的数据是表示 Text 控件属性的 Button 字符串,允许的效果是复制或移动。
Private Sub Button1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Button1.MouseDown Button1.DoDragDrop(Button1.Text, DragDropEffects.Copy Or DragDropEffects.Move) End Sub
private void button1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e) { button1.DoDragDrop(button1.Text, DragDropEffects.Copy | DragDropEffects.Move); }
在拖动操作生效期间,可以处理 QueryContinueDrag 事件,该事件会“请求系统继续拖动操作的权限”。 处理此方法时,可以在合适的时机调用会影响拖动操作的方法,例如当光标悬停在控件上时展开TreeNode中的TreeView。
删除数据
开始从 Windows 窗体或控件上的某个位置拖动数据后,你自然会想要将其拖放到某个位置。 当光标跨越一个已正确配置为放置数据的窗体或控件区域时,它将发生变化。 Windows 窗体或控件中的任何区域都可以通过设置 AllowDrop 属性和处理 DragEnter 和 DragDrop 事件来接受已删除的数据。
执行删除
将 AllowDrop 属性设置为 true。
在
DragEnter
控件的发生事件中,请确保所拖动的数据是可接受的类型(在本例中为Text)。 然后,该代码将下拉时发生的效果设置为枚举中的DragDropEffects值。 有关详细信息,请参阅 Effect。Private Sub TextBox1_DragEnter(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles TextBox1.DragEnter If (e.Data.GetDataPresent(DataFormats.Text)) Then e.Effect = DragDropEffects.Copy Else e.Effect = DragDropEffects.None End If End Sub
private void textBox1_DragEnter(object sender, System.Windows.Forms.DragEventArgs e) { if (e.Data.GetDataPresent(DataFormats.Text)) e.Effect = DragDropEffects.Copy; else e.Effect = DragDropEffects.None; }
注释
可以通过将自己的对象指定为SetData方法的Object参数来定义自己的DataFormats。 请确保执行此作时,指定的对象是可序列化的。 有关详细信息,请参阅 ISerializable。
在放置发生的控件的DragDrop事件中,使用GetData方法检索被拖动的数据。 有关详细信息,请参阅 Data。
在下面的示例中, TextBox 控件是被拖动到的控件(放置的地方)。 该代码将TextBox控件的Text属性设置为等于所拖动的数据。
Private Sub TextBox1_DragDrop(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles TextBox1.DragDrop TextBox1.Text = e.Data.GetData(DataFormats.Text).ToString End Sub
private void textBox1_DragDrop(object sender, System.Windows.Forms.DragEventArgs e) { textBox1.Text = e.Data.GetData(DataFormats.Text).ToString(); }
注释
此外,您可以使用KeyState属性,以便通过按键来实现某些效果,例如,按下 CTRL 键时标准操作是复制拖动的数据。不同的按键会导致不同的效果。