拖放在C/S开发过程中总是一个难点,但是,为了得到更好的用户体验,很多地方还是需要使用到拖放的,今天,我们介绍一下WPF的拖放。
还是以往的惯例,用实例来说明WPF的拖放是如何实现的。
我们要实现的就是让左边的红色矩形移动到右边。首先,我们先编写xaml文件,代码如下
1
2
3
4
5
6
7
8
9
10
11
|
<Window x:Class=
"DragDropDemo1.Window1"
Title=
"Window1"
Height=
"319"
Width=
"494"
>
<Grid>
<Canvas Margin=
"14,19,216,20"
Name=
"canvas1"
Background=
"Azure"
>
<Rectangle Height=
"53"
Name=
"rectangle1"
Stroke=
"Black"
Width=
"91"
Fill=
"Crimson"
/>
</Canvas>
<Canvas HorizontalAlignment=
"Right"
Margin=
"0,22,5,21"
Name=
"canvas2"
Width=
"199"
Background=
"DarkSalmon"
AllowDrop=
"True"
/>
</Grid>
</Window>
|
接着,我们来实现拖放中的拖,这个是最重要的部分,首先,我们注册矩形的PreviewMouseMove事件。代码如下:
1
2
3
4
5
6
7
8
9
10
|
this
.rectangle1.PreviewMouseMove +=
new
MouseEventHandler(rectangle1_PreviewMouseMove);
void
rectangle1_PreviewMouseMove(
object
sender, MouseEventArgs e)
{
if
(e.LeftButton == MouseButtonState.Pressed)
{
DataObject data =
new
DataObject(
typeof
(Rectangle),
this
.rectangle1);
DragDrop.DoDragDrop(
this
.rectangle1, data, DragDropEffects.Move);
}
}
|
需要说明的是这里的data就是我们拖放时的实际数据,我们使用DragDrop.DoDragDrop()方法启动拖放操作,将数据带入拖放操作中。
接下来,我们实现放置操作,将拖放的数据放置到相应的控件上。所以我们首先要设置放置对象的AllowDrop=”True”属性,让其具有可以放置的特性,接着实现放置控件的DragOver(拖动完成),Drop(放置)事件。代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
this
.canvas2.DragOver +=
new
DragEventHandler(canvas2_DragOver);
this
.canvas2.Drop +=
new
DragEventHandler(canvas2_Drop);
void
canvas2_DragOver(
object
sender, DragEventArgs e)
{
if
(!e.Data.GetDataPresent(
typeof
(Rectangle)))
{
e.Effects = DragDropEffects.None;
e.Handled =
true
;
}
}
void
canvas2_Drop(
object
sender, DragEventArgs e)
{
IDataObject data = e.Data;
if
(data.GetDataPresent(
typeof
(Rectangle)))
{
Rectangle rect = data.GetData(
typeof
(Rectangle))
as
Rectangle;
this
.canvas1.Children.Remove(rect);
this
.canvas2.Children.Add(rect);
}
}
|
我们在DragOver中判断拖动中的数据数据类型是否是我们放置的数据类型,如果不是则停止拖放。我们在Drop事件中将对象放置,即完成所有拖放操作。通过上面代码可以很好的完成一些简单拖放,后面我们会介绍,拖放时如何让对象跟随鼠标等效果。
代码下载