通过处理一系列事件,最著名的有 DragEnter、DragLeave 和 DragDrop 事件,来在 Windows 应用程序内完成拖放操作。通过使用这些事件的事件参数中的可用信息,可以轻松地简化拖放操作。
拖动数据
所有拖放操作都从拖动开始。当拖动开始时,在 DoDragDrop 方法中实现使数据得以收集的功能。
在下面的示例中,使用 MouseDown 事件启动拖动操作,因为该事件最直观(大部分拖放操作都从按下鼠标按钮开始)。但是,请记住,任何事件都可用于启动拖放过程。
注意 某些控件具有自定义的、特定于拖动的事件。例如,ListView 和 TreeView 控件有 ItemDrag 事件。
启动拖动操作
在由其中开始拖动的控件的 MouseDown 事件中,使用 DoDragDrop 方法设置要拖动的数据,并设置拖动将具有的允许效果。有关更多信息,请参见 DataEventArgs.Data 属性和 DataEventArgs.AllowedEffect 属性。
下面的示例显示如何启动拖动操作。拖动开始于的控件是 Button 控件,要拖动的数据是表示 Button 控件的 Text 属性的字符串,允许的效果是复制或移动。
private void button1_MouseDown(object sender,
System.Windows.Forms.MouseEventArgs e)
{
button1.DoDragDrop(button1.Text, DragDropEffects.Copy |
DragDropEffects.Move);
}
注意 请注意,任何数据都可用作 DoDragDrop 方法中的参数;在上面的示例中,使用 Button 控件的 Text 属性(而不是对值进行硬编码或从数据集检索数据),因为该属性与(从 Button 控件)开始拖动的位置相关。当将拖放操作合并到 Windows 应用程序中时,请牢记这一点。
拖动操作生效后,可以处理 QueryContinueDrag 事件,该事件“要求系统权限”以继续该拖动操作。当处理此方法时,此时也适于调用将对该拖动操作产生效果的方法,如当光标悬停在 TreeView 控件中的 TreeNode 上时,展开它。
放置数据
开始从 Windows 窗体或控件上的某个位置拖动数据后,将很自然地要将其放置在某处。当光标经过为放置数据而进行了正确配置的窗体或控件区域时,会发生改变。可以通过设置 AllowDrop 属性以及处理 DragEnter 和 DragDrop 事件,使 Windows 窗体或控件内的任何区域接受放置的数据。
执行放置
在“属性”窗口中,将 AllowDrop 属性设置为 true。
右击解决方案资源管理器中的窗体,并选择“查看代码”。
在将要发生放置操作的控件的 DragEnter 事件中,使用 If 语句进行类型检查,确保被拖动数据的类型是可以接受的(在这种情况下为 Text)。代码随后将发生放置操作时将发生的结果设置为 DragDropEffects 枚举中的值。有关更多信息,请参见 DragEventArgs.Effect 属性。
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;
}
注意 请注意,您也可以定义您自己的 DataFormats。这与将您自己的对象指定为 SetData 方法的 Object 参数一样简单。在进行该操作时,请确保指定的对象可序列化。有关更多信息,请参见 ISerializable 接口。
在将要发生放置操作的控件的 DragDrop 事件中,使用 GetData 方法检索正在被拖动的数据。有关更多信息,请参见 DataObject.Data 属性。
在下面的示例中,TextBox 控件是要拖动到的控件(发生放置操作的位置)。代码将 TextBox 控件的 Text 属性设置为等于要拖动的数据。
private void textBox1_DragDrop(object sender,
System.Windows.Forms.DragEventArgs e)
{
textBox1.Text = e.Data.GetData(DataFormats.Text).ToString();
}
注意 另外,还可使用 KeyState 属性,以便根据拖放操作过程中按下的键,出现相应的效果(例如,当按下 CTRL 键时复制拖动的数据是标准操作)。
来自百度 |