WPF中的拖放(Drag and Drop)[转载]

本文详细介绍了在WPF中如何实现拖放(Drag and Drop)功能,包括基本原理、步骤和示例代码,帮助开发者掌握这一交互技术。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转自http://hi.baidu.com/xiaokang088/blog/item/ec456bdc1a4c46a8cd1166ab.html


http://newinfo.sysu.edu.cn/Snowwaft/?p=230

和WinForm类似,在WPF中,也有拖放功能。所谓拖放,是指将目标从拖动源中拖出,然后放置到目标对象上。因此,在WPF的拖放过程中,有5个需要注意的:


目标:需要拖放的对象,这个对象可能是一副图片,或者是TextBox中的文字,也可能是List中的某一项。
拖动源:目标原来所在的容器,例如一个Canvas,一个TextBox,或者一个List。
目标对象:目标的“新家”,例如一个Canvas,一个TextBox,或者一个List。
拖动(Drag):一个动作,一般是在目标上按住鼠标左键,然后移动鼠标。
放置(Drop):在目标对象上松开鼠标左键。
目标

在WPF中,我们使用一个实现了IDataObject的接口来封装目标:这个接口有以下几个代表方法:


GetData :检索指定数据格式的数据对象。
GetDataPresent :查看是否具有指定格式的数据,或者数据是否可以转换为指定格式。
GetFormats :返回一个格式列表,此数据对象中的数据以这些格式存储,或可以转换为这些格式。
SetData :在此数据对象中存储指定的数据。

WPF 提供 DataObject 类中的 IDataObject 的基本实现;对于许多常见数据传输方案,常用 DataObject 类已足够满足要求。

以下代码我们用DataObject包装了ListView中的一行数据:

DataObject data = new DataObject(typeof(ItemInfo), listview.SelectedItem);


目标对象

UIElement类中,有一个AllowDrop属性,用来指此元素是否可用作拖放操作的目标。在默认情况下该属性的值为false。因此,需要将该值设置为True:

<object AllowDrop=”bool” …/>


拖动

前面提到了,拖动有是由两个动作所构成:按下鼠标左键,移动鼠标:


代码:
protected bool m_IsDraging = false;
protected Point m_DragStartPoint;
private void LV_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
   m_DragStartPoint = e.GetPosition(null);
}
private void LV_PreviewMouseMove(object sender, MouseEventArgs e)
{
   var lv = sender as ListView;
   if (lv.SelectedItem == null) return;
   if (e.LeftButton == MouseButtonState.Pressed && !m_IsDraging)
   {
   Point position = e.GetPosition(null);
   if (e.LeftButton == MouseButtonState.Pressed && !m_IsDraging)
   {
   Point position = e.GetPosition(null);
   if (Math.Abs(position.X - m_DragStartPoint.X) > SystemParameters.MinimumHorizontalDragDistance ||
   Math.Abs(position.Y - m_DragStartPoint.Y) > SystemParameters.MinimumVerticalDragDistance)
   {
   m_IsDraging = true;
   DataObject data = new DataObject(typeof(ItemInfo), lv.SelectedItem);
   DragDropEffects de = DragDrop.DoDragDrop(lv, data, DragDropEffects.Copy);
   m_IsDraging = false;
   }
   }
}

以上代码里,我们使用代码:


代码:
DataObject data = new DataObject(typeof(ItemInfo), lv.SelectedItem);
DragDropEffects de = DragDrop.DoDragDrop(lv, data, DragDropEffects.Copy);

来发起一个拖动动作。


放置

WPF提供了一系列和放置有关的事件:


DragEnter :将对象拖至放置目标的边框内时发生此事件。
DragLeave :将对象拖出放置目标的边框时发生此事件。
DragOver :在放置目标的边框内拖动(移动)对象时发生此事件。
Drop :将对象放到放置目标上时发生此事件。


代码:
private void FileSystemListView_PreviewDrop(object sender, DragEventArgs e)
{
   var data = e.Data;
   if (data.GetDataPresent(typeof(FileSystemListView.ItemInfo)))
   {
   var info=data.GetData(typeof(FileSystemListView.ItemInfo)) as FileSystemListView.ItemInfo;
   MessageBox.Show(info.Name);
   }
}

这里的e.Data就是对目标的封装。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值