.NEt专家博客!

【李会军】一步一步学Silverlight 2系列(5):实现简单的拖放功能

上一篇 / 下一篇  2008-04-11 19:21:14

概述

Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言Visual Basic, Visual C#, IronRuby, Ironpython,对JSON、Web Service、WCF以及Sockets的支持等一系列新的特性。《一步一步学Silverlight 2系列》文章带您快速进入Silverlight 2开发。

本文为系列文章第五篇,利用前面讲过的鼠标事件处理实现简单的拖放功能。

准备XAML

在实现拖放功能中,分为三个步骤:

1.按下鼠标,触发MouseLeftButtonDown事件,选择要拖动的对象。

2.移动鼠标,触发MouseMove事件,移动选择的对象。

3.放开鼠标,触发MouseLeftButtonUp事件,停止捕捉事件。

做一个简单的界面,用一个按钮来显示拖放,如下XAML声明:

<CanvasBackground="#46461F">ITPUB个人空间$k'~){xh9b.S
<
ButtonITPUB个人空间EOd8O\5h {5IG(e,\
MouseLeftButtonDown="OnMouseDown"
p6n:K\ a0
MouseMove="OnMouseMove"
+HPR@,[.e]#Q0
MouseLeftButtonUp="OnMouseUp"
o"?2W0wm k'zB0
Canvas.Left="50"Canvas.Top="50"Background="Red"ITPUB个人空间H%z_y r$\v
FontSize="18"ITPUB个人空间4l3k Ubarj%sE
Width="160"Height="80">ITPUB个人空间f/W`^0\ h}J`
<
Button.Content>
;W Q AecT~$Wu)g$g)k0<
StackPanelOrientation="Horizontal"HorizontalAlignment="Center"
UNc{\+tM N5M0
VerticalAlignment="Center">ITPUB个人空间,Vm\0["X6jB
<
ImageSource="smile_6.png"></Image>
3?F#N6Te1Qe/E*^,ZY0<
TextBlockText="拖动我"VerticalAlignment="Center"Margin="10"></TextBlock>ITPUB个人空间RM/T7Iu(dk(Y
</
StackPanel>ITPUB个人空间^d CX6e ^b:P
</
Button.Content>ITPUB个人空间r8pqOD$Sk
</
Button>
wO n"j[J0</
Canvas>

这里为了界面显示效果,使用了控件模板,后续会专门讲到。

开始拖放操作

开始拖放操作,实现MouseLeftButtonDown事件处理程序,用两个全局变量来记录当前鼠标的位置和鼠标是否保持移动。

booltrackingMouseMove =false;ITPUB个人空间(kr0s"|enu
PointmousePosition;
2P0Etd"|0ITPUB个人空间"s+dJ+Sa9`*C2Ds
voidOnMouseDown(objectsender,MouseButtonEventArgse)
R!{A7SK#\ u1P6H0{
6y mp2y;W*M#c)x0FrameworkElementelement = senderasFrameworkElement;ITPUB个人空间6g\7G)h8~ba
mousePosition = e.GetPosition(null);ITPUB个人空间$Q:_ `F`t5['t
trackingMouseMove =true;
vf)j8vSYq&a9g0if(null!= element)ITPUB个人空间 r%V)N!c.x.h
{ITPUB个人空间;Z'F8u:n[4{$NMMF
element.CaptureMouse();
c#r7do4O j\^;v.x0element.Cursor =Cursors.Hand;
fZPS"LWhE}0}
'\F z*k2{Px~0}

移动对象

移动对象,实现MouseMove事件处理程序,计算元素的位置并更新,同时更新鼠标的位置。

voidOnMouseMove(objectsender,MouseEventArgse)ITPUB个人空间w7i6PMBhr7{+C
{ITPUB个人空间 ]a a1~%ov
FrameworkElementelement = senderasFrameworkElement;ITPUB个人空间 x-`]5Y A
if(trackingMouseMove)ITPUB个人空间K+B:jf^KJ
{
-q4v:IC%~H0doubledeltaV = e.GetPosition(null).Y - mousePosition.Y;
y@}G;?&nr0doubledeltaH = e.GetPosition(null).X - mousePosition.X;
`c,b-r i:`)y8U0doublenewTop = deltaV + (double)element.GetValue(Canvas.TopProperty);
zuK"s c0doublenewLeft = deltaH + (double)element.GetValue(Canvas.LeftProperty);ITPUB个人空间+H B#N5[:sU2o
ITPUB个人空间(R(dM5I/A.S:W9{
element.SetValue(Canvas.TopProperty, newTop);
sv[b!w?u0element.SetValue(Canvas.LeftProperty, newLeft);ITPUB个人空间]EL#D x2o @p
ITPUB个人空间bxIH;~eG
mousePosition = e.GetPosition(null);ITPUB个人空间[4B*S?#rS
}
i _ WXZ9O0}

完成拖放操作

完成拖放操作,实现MouseLeftButtonUp事件处理程序。

voidOnMouseUp(objectsender,MouseButtonEventArgse)ITPUB个人空间,DO`[fazT
{
)B%g3ODv Y%l.S a0FrameworkElementelement = senderasFrameworkElement;
"D-]1GRW7a)hr$C0trackingMouseMove =false;ITPUB个人空间Ml8k U$G Fwj"k
element.ReleaseMouseCapture();
QS3Qe,y"j![B$y2h0ITPUB个人空间 M0t&r*I df'r2T
mousePosition.X = mousePosition.Y = 0;ITPUB个人空间1\1Che U+Qk
element.Cursor =null;
|,m)rm$w5o0}

效果显示

最终,完成后的效果如下
"pA}5yI{0ITPUB个人空间0]O!x0Ylf
拖动按钮ITPUB个人空间;z c6}xr

*P\-uC3~ YN9^,up0

结束语

本文实现了一个简单的拖放功能(示例来自于Silverlight 2 SDK),点击下载文本示例代码。

作者:TerryLeeITPUB个人空间B/u3CU&S|U T)|~
出处:http://terrylee.cnblogs.com

ITPUB个人空间m;S#mo#Le!l;R


TAG:

引用 删除 Guest   /   2009-04-25 22:05:01
3
引用 删除 Guest   /   2008-12-23 19:07:41
-5
anniexing的个人空间 引用 删除 anniexing   /   2008-11-04 19:10:27
3
引用 删除 Guest   /   2008-06-19 11:03:23
 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

Open Toolbar