在本书第六章的6.1.4小节中,曾经介绍过一个拖动画布的示例,该示例使用鼠标事件控制对象的拖动。由于拖动操作是一个连续的过程,因此需要分别处理MouseLeftButtonDown、 MouseLeftButtonUp 和MouseMove。

通常一个拖放操作需要处理如下所示的三类事件:

q      选定对象:在对象上单击鼠标左键选中该对象,通过实现MouseLeftButtonDown事件实现。

q      鼠标移动:不断的检测鼠标的位置来调整所选对象的位置,通过MouseMove事件实现。

q      释放对象:释放鼠标左键来停放对象,通过MouseLeftButtonUp事件实现。

注意:拖放操作只能在一个Silverlight插件中进行,不能跨插件进行拖放。

除了这三个事件需要处理之外,还需要使用两个方法来捕捉鼠标位置,这两个方法分别是CaptureMouse和ReleaseMouseCapture方法。

当鼠标指针位于图形对象之外时,对该图形定义的鼠标事件是无法追踪到鼠标的位置的,但是如果运行了CaptureMouse方法,则不论鼠标是否位于该图形之内,也能获取到鼠标的位置信息。

为了更清楚的了解CaptureMose和ReleaseMouseCapture方法的使用,在此举一个示例,运行效果如图12.5所示。

ios rd client鼠标_silverlight

该示例中绘制了两个矩形,当在矩形上移动鼠标时,会显示出坐标。但是如果鼠标移出矩形,则不会继续显示坐标值。但是如果单击绿色矩形不松开鼠标,再移出矩形区域,坐标值会持续更新。松开鼠标则停止鼠标追踪。

该示例的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();
        }
    }
}