下面的示例演示如何在基于 Silverlight 的应用程序中拖放对象。出于安全考虑,不能在应用程序之间拖放对象。因此,说成在 Silverlight 插件区域内"滑动"对象更为准确。但是,术语"拖放"更为人知,因此在此处使用。
Xaml脚本:
<
UserControl
x:Class
="DragAndDropSimple.Page"
xmlns ="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x ="http://schemas.microsoft.com/winfx/2006/xaml"
Width ="400" Height ="300" >
< Canvas x:Name ="rootCanvas"
Width ="640"
Height ="480"
Background ="Gray"
>
<!-- You can drag this rectangle around the canvas. -->
< Rectangle
MouseLeftButtonDown ="Handle_MouseDown"
MouseMove ="Handle_MouseMove"
MouseLeftButtonUp ="Handle_MouseUp"
Canvas.Left ="30" Canvas.Top ="30" Fill ="Red"
Width ="50" Height ="50" />
</ Canvas >
</ UserControl >
xmlns ="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x ="http://schemas.microsoft.com/winfx/2006/xaml"
Width ="400" Height ="300" >
< Canvas x:Name ="rootCanvas"
Width ="640"
Height ="480"
Background ="Gray"
>
<!-- You can drag this rectangle around the canvas. -->
< Rectangle
MouseLeftButtonDown ="Handle_MouseDown"
MouseMove ="Handle_MouseMove"
MouseLeftButtonUp ="Handle_MouseUp"
Canvas.Left ="30" Canvas.Top ="30" Fill ="Red"
Width ="50" Height ="50" />
</ Canvas >
</ UserControl >
后置代码:
//
Global variables used to keep track of the
// mouse position and whether the object is captured
// by the mouse.
bool isMouseCaptured;
double mouseVerticalPosition;
double mouseHorizontalPosition;
public void Handle_MouseDown ( object sender, MouseEventArgs args)
{
Rectangle item = sender as Rectangle;
mouseVerticalPosition = args.GetPosition( null ).Y;
mouseHorizontalPosition = args.GetPosition( null ).X;
isMouseCaptured = true ;
item.CaptureMouse();
}
public void Handle_MouseMove( object sender, MouseEventArgs args)
{
Rectangle item = sender as Rectangle;
if (isMouseCaptured)
{
// Calculate the current position of the object.
double deltaV = args.GetPosition( null ).Y - mouseVerticalPosition;
double deltaH = args.GetPosition( null ).X - mouseHorizontalPosition;
double newTop = deltaV + ( double )item.GetValue(Canvas.TopProperty);
double newLeft = deltaH + ( double )item.GetValue(Canvas.LeftProperty);
// Set new position of object.
item.SetValue(Canvas.TopProperty, newTop);
item.SetValue(Canvas.LeftProperty, newLeft);
// Update position global variables.
mouseVerticalPosition = args.GetPosition( null ).Y;
mouseHorizontalPosition = args.GetPosition( null ).X;
}
}
public void Handle_MouseUp( object sender, MouseEventArgs args)
{
Rectangle item = sender as Rectangle;
isMouseCaptured = false ;
item.ReleaseMouseCapture();
mouseVerticalPosition = - 1 ;
mouseHorizontalPosition = - 1 ;
}
// mouse position and whether the object is captured
// by the mouse.
bool isMouseCaptured;
double mouseVerticalPosition;
double mouseHorizontalPosition;
public void Handle_MouseDown ( object sender, MouseEventArgs args)
{
Rectangle item = sender as Rectangle;
mouseVerticalPosition = args.GetPosition( null ).Y;
mouseHorizontalPosition = args.GetPosition( null ).X;
isMouseCaptured = true ;
item.CaptureMouse();
}
public void Handle_MouseMove( object sender, MouseEventArgs args)
{
Rectangle item = sender as Rectangle;
if (isMouseCaptured)
{
// Calculate the current position of the object.
double deltaV = args.GetPosition( null ).Y - mouseVerticalPosition;
double deltaH = args.GetPosition( null ).X - mouseHorizontalPosition;
double newTop = deltaV + ( double )item.GetValue(Canvas.TopProperty);
double newLeft = deltaH + ( double )item.GetValue(Canvas.LeftProperty);
// Set new position of object.
item.SetValue(Canvas.TopProperty, newTop);
item.SetValue(Canvas.LeftProperty, newLeft);
// Update position global variables.
mouseVerticalPosition = args.GetPosition( null ).Y;
mouseHorizontalPosition = args.GetPosition( null ).X;
}
}
public void Handle_MouseUp( object sender, MouseEventArgs args)
{
Rectangle item = sender as Rectangle;
isMouseCaptured = false ;
item.ReleaseMouseCapture();
mouseVerticalPosition = - 1 ;
mouseHorizontalPosition = - 1 ;
}