在本书第六章的6.1.4小节中,曾经介绍过一个拖动画布的示例,该示例使用鼠标事件控制对象的拖动。由于拖动操作是一个连续的过程,因此需要分别处理MouseLeftButtonDown、 MouseLeftButtonUp 和MouseMove。
通常一个拖放操作需要处理如下所示的三类事件:
q 选定对象:在对象上单击鼠标左键选中该对象,通过实现MouseLeftButtonDown事件实现。
q 鼠标移动:不断的检测鼠标的位置来调整所选对象的位置,通过MouseMove事件实现。
q 释放对象:释放鼠标左键来停放对象,通过MouseLeftButtonUp事件实现。
注意:拖放操作只能在一个Silverlight插件中进行,不能跨插件进行拖放。
除了这三个事件需要处理之外,还需要使用两个方法来捕捉鼠标位置,这两个方法分别是CaptureMouse和ReleaseMouseCapture方法。
当鼠标指针位于图形对象之外时,对该图形定义的鼠标事件是无法追踪到鼠标的位置的,但是如果运行了CaptureMouse方法,则不论鼠标是否位于该图形之内,也能获取到鼠标的位置信息。
为了更清楚的了解CaptureMose和ReleaseMouseCapture方法的使用,在此举一个示例,运行效果如图12.5所示。
该示例中绘制了两个矩形,当在矩形上移动鼠标时,会显示出坐标。但是如果鼠标移出矩形,则不会继续显示坐标值。但是如果单击绿色矩形不松开鼠标,再移出矩形区域,坐标值会持续更新。松开鼠标则停止鼠标追踪。
该示例的XAML代码如下所示。
<Canvas x:Name="parentCanvas"
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Loaded="Page_Loaded"
x:Class="MouseCapture.Page;assembly=ClientBin/MouseCapture.dll"
Width="640"
Height="480"
Background="White"
>
<!--定义一个绿色矩形块,当在绿色矩形块上单击时,开始捕捉鼠标-->
<Rectangle
x:Name="Green"
MouseMove="onMouseMove"
MouseLeftButtonDown="onLeftButtonDown"
MouseLeftButtonUp="onLeftButtonUp"
Width="100" Height="100" Canvas.Left="50" Canvas.Top="50"
Fill="Green" />
<!-- onMouseMove事件是与绿色矩形共享的 -->
<Rectangle
x:Name="Red"
MouseMove="onMouseMove"
Canvas.Left="180" Canvas.Top="50"
Width="100" Height="100"
Fill="Maroon" />
<!--定义一个文本块用于显示文本-->
<TextBlock
x:Name="statusTextBlock"
FontSize="18" Canvas.Left="50"
Canvas.Top="160" />
</Canvas>
XAML代码中定义了的onMouseMove事件将由两个矩形所共享。另外为绿色椭圆定义了MouseLeftButtonDown和MouseLeftButtonUp事件,用于处理鼠标左键按下和释放,后置代码如下所示。
namespace MouseCapture
{
public partial class Page : Canvas
{
public void Page_Loaded(object o, EventArgs e)
{
// Required to initialize variables
InitializeComponent();
}
// 显增矩形的当前鼠标位置
public void onMouseMove(object sender, MouseEventArgs e)
{
string msg = "x:y = " + e.GetPosition(null).X.ToString() + ", " + e.GetPosition(null).Y.ToString();
statusTextBlock.Text = ((Rectangle)sender).Name + msg;
}
// 开始捕捉鼠标
public void onLeftButtonDown(object sender, MouseEventArgs e)
{
((Rectangle)sender).CaptureMouse();
}
// 禁用鼠标捕捉
public void onLeftButtonUp(object sender, MouseEventArgs e)
{
((Rectangle)sender).ReleaseMouseCapture();
}
}
}