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"> |
06 |
<Canvas Margin="14,19,216,20" Name="canvas1" Background="Azure"> |
07 |
<Rectangle Height="53" Name="rectangle1" Stroke="Black" Width="91"Fill="Crimson" /> |
09 |
<Canvas HorizontalAlignment="Right" Margin="0,22,5,21" Name="canvas2" Width="199" Background="DarkSalmon" AllowDrop="True" /> |
接着,我们来实现拖放中的拖,这个是最重要的部分,首先,我们注册矩形的PreviewMouseMove事件。代码如下:
01 |
this.rectangle1.PreviewMouseMove += new MouseEventHandler(rectangle1_PreviewMouseMove); |
03 |
voidrectangle1_PreviewMouseMove(object sender, MouseEventArgs e) |
05 |
if(e.LeftButton == MouseButtonState.Pressed) |
07 |
DataObject data = new DataObject(typeof(Rectangle), this.rectangle1); |
08 |
DragDrop.DoDragDrop(this.rectangle1, data, DragDropEffects.Move); |
需要说明的是这里的data就是我们拖放时的实际数据,我们使用DragDrop.DoDragDrop()方法启动拖放操作,将数据带入拖放操作中。
接下来,我们实现放置操作,将拖放的数据放置到相应的控件上。所以我们首先要设置放置对象的AllowDrop=”True”属性,让其具有可以放置的特性,接着实现放置控件的DragOver(拖动完成),Drop(放置)事件。代码如下:
01 |
this.canvas2.DragOver += new DragEventHandler(canvas2_DragOver); |
02 |
this.canvas2.Drop += new DragEventHandler(canvas2_Drop); |
04 |
voidcanvas2_DragOver(object sender, DragEventArgs e) |
06 |
if(!e.Data.GetDataPresent(typeof(Rectangle))) |
08 |
e.Effects = DragDropEffects.None; |
12 |
voidcanvas2_Drop(object sender, DragEventArgs e) |
14 |
IDataObject data = e.Data; |
16 |
if(data.GetDataPresent(typeof(Rectangle))) |
18 |
Rectangle rect = data.GetData(typeof(Rectangle)) as Rectangle; |
19 |
this.canvas1.Children.Remove(rect); |
20 |
this.canvas2.Children.Add(rect); |
我们在DragOver中判断拖动中的数据数据类型是否是我们放置的数据类型,如果不是则停止拖放。我们在Drop事件中将对象放置,即完成所有拖放操作。通过上面代码可以很好的完成一些简单拖放,后面我们会介绍,拖放时如何让对象跟随鼠标等效果。
代码下载