拖 放 操 作 拖放操作 拖放操作
1.拖放操作
拖放操作
Drag and Drop
是两个窗口之间传递数据的一种手段
拖放操作两部分:拖Drag
、放Drop
几个术语:
源窗口: 发起拖拽 Start Drag
目标窗口: 接受拖放 Accept Drop
拖拽物: 即传输的数据 DataObject
大致了解拖放操作的意思
Drag and Drop
用来传递数据,相当于剪贴板操作
2.接受拖放
默认地,窗口控件不支持拖放操作
实例:添加一个面板,使其能够接受拖放
- 1 设置AllowDrop为 True
- 2 响应 Drop相关事件
DragEnter拖放操作进入
DragLeave拖放操作进入
DragOver拖放操作降临(窗口内移动)
DragDrop松手,接受拖放数据
void panel1_DragEnter (sender, e ) { }
有资源送来,接受or拒绝?|
接受此拖放:
e.Effect = DragDropEffects.All;
拒绝此拖放:
e.Effect = DragDropEffects.None;
void panel1_DragDrop(sender, e ) { }
用户已经松手,取得传递来的数据
if (e.Data.GetDataPresent(typeof(string))) {
string str = (string)e.Data.GetData(typeof(string));
MessageBox.Show("数据: " + str);
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Winform自定义控件
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_DragEnter(object sender, DragEventArgs e)
{
e.Effect = DragDropEffects.All;
}
private void Form1_DragOver(object sender, DragEventArgs e)
{
}
private void Form1_DragDrop(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(typeof(string))) {
string str = (string)e.Data.GetData(typeof(string));
MessageBox.Show("数据: " + str);
}
}
private void Form1_DragLeave(object sender, EventArgs e)
{
}
}
}
接受拖放处理的3步:
1 设置AllowDrp为True
2 响应 DragEnter,接受/拒绝
3 响应DragDrop,取出数据并显示
3.拖放的数据类型
拖放的数据类型,常见的有:
- 纯文本
- 图片
- 富文本/带格式文本
- 超链接/文件路径等
观察拖放物中的数据类型
string[] formats = e.Data.GetFormats();
foreach(string fmt in formats)
{
Console.WriteLine("格式: "+ fmt);
}
一般来说,应用程序只接受固定的类型
例如,
PhotoShop:接受图片数据/文件路径
Notepad:接受纯文本数据
Word:接受文本、HTML、图片、文件路径、超链接
在 DragEnter
事件处理中,检查和判断数据类型
if(e.Data.GetDataPresent("System.String"))
{
e.Effect = DragDropEffects.All;
}
如果未设置,则e.Effect的默认值为None
4.复制与移动
拖放的操作类型:
- None无操作
- Copy 复制
- Move移动
- All任意
(1)一般地,拖放时按住CTRL键,表示复制
(2)在复制操作时,光标下方显示一个加号
5.接受文件拖放
将一个文本文件拖放到程序中,直接打开文件的内容
注意:这里仅支持文本文件
判断拖放的数据类型"FileDrop"
如果不确定格式,可以先打印检查一下
string[] formats = e.Data.GetFormats();
foreach(string fmt in formats)
{
Console.WriteLine("格式:" +fmt);
}
取得拖拽的数据:
object dragData = e.Data.GetData("FileDrop");
WinForm内部已经对数据作了转换,转成C#里的类型如果不确定,可以单步调试检查一下
string[] files = (string[])dragData;
1 本例中,是对Form1添加的拖放支持
也可以对TextBox控件单独添加拖放支持
2 拖放文件时,实际传递的是文件路径信息,并没有把文件数据传过来I
6.接受图片拖放
实例:将一个图片拖放到程序中,并直接显示
注意,拖放的图片对象,不是图片文件可以从Word里拖一个图片出来测试
注意区分图片
与图片文件
- 拖拽图片文件时,数据中是文件的路径
- 拖拽图片时,数据时中是图片的内容字节
重点:文本的拖放、文件的拖放