WPF中的拖放(一)

本文来自.NET开发者 作者:苏扬

拖放在C/S开发过程中总是一个难点,但是,为了得到更好的用户体验,很多地方还是需要使用到拖放的,今天,我们介绍一下WPF的拖放。

还是以往的惯例,用实例来说明WPF的拖放是如何实现的。

我们要实现的就是让左边的红色矩形移动到右边。首先,我们先编写xaml文件,代码如下

01 <Window x:Class="DragDropDemo1.Window1"
02     xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
03     xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
04     Title="Window1"Height="319"Width="494">
05     <Grid>
06         <Canvas Margin="14,19,216,20"Name="canvas1"Background="Azure">
07             <Rectangle Height="53"Name="rectangle1"Stroke="Black"Width="91"Fill="Crimson"/>
08         </Canvas>
09         <Canvas HorizontalAlignment="Right"Margin="0,22,5,21"Name="canvas2"Width="199"Background="DarkSalmon"AllowDrop="True"/>
10     </Grid>
11 </Window>

接着,我们来实现拖放中的拖,这个是最重要的部分,首先,我们注册矩形的PreviewMouseMove事件。代码如下:

01 this.rectangle1.PreviewMouseMove +=newMouseEventHandler(rectangle1_PreviewMouseMove);
02   
03 voidrectangle1_PreviewMouseMove(objectsender, MouseEventArgs e)
04 {
05     if(e.LeftButton == MouseButtonState.Pressed)
06     {
07         DataObject data =newDataObject(typeof(Rectangle),this.rectangle1);
08         DragDrop.DoDragDrop(this.rectangle1, data, DragDropEffects.Move);
09     }
10 }

需要说明的是这里的data就是我们拖放时的实际数据,我们使用DragDrop.DoDragDrop()方法启动拖放操作,将数据带入拖放操作中。

接下来,我们实现放置操作,将拖放的数据放置到相应的控件上。所以我们首先要设置放置对象的AllowDrop=”True”属性,让其具有可以放置的特性,接着实现放置控件的DragOver(拖动完成),Drop(放置)事件。代码如下:

01 this.canvas2.DragOver +=newDragEventHandler(canvas2_DragOver);
02 this.canvas2.Drop +=newDragEventHandler(canvas2_Drop);
03   
04 voidcanvas2_DragOver(objectsender, DragEventArgs e)
05 {
06     if(!e.Data.GetDataPresent(typeof(Rectangle)))
07     {
08         e.Effects = DragDropEffects.None;
09         e.Handled =true;
10     }
11 }
12 voidcanvas2_Drop(objectsender, DragEventArgs e)
13 {
14     IDataObject data = e.Data;
15   
16     if(data.GetDataPresent(typeof(Rectangle)))
17     {
18         Rectangle rect = data.GetData(typeof(Rectangle))asRectangle;
19         this.canvas1.Children.Remove(rect);
20         this.canvas2.Children.Add(rect);
21     }
22 }

我们在DragOver中判断拖动中的数据数据类型是否是我们放置的数据类型,如果不是则停止拖放。我们在Drop事件中将对象放置,即完成所有拖放操作。通过上面代码可以很好的完成一些简单拖放,后面我们会介绍,拖放时如何让对象跟随鼠标等效果。
代码下载