精通Silverlight——12.2.5 鼠标托动编程

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

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

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

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

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

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

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

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

为了更清楚的了解CaptureMoseReleaseMouseCapture方法的使用,在此举一个示例,运行效果如图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事件将由两个矩形所共享。另外为绿色椭圆定义了MouseLeftButtonDownMouseLeftButtonUp事件,用于处理鼠标左键按下和释放,后置代码如下所示。

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();

        }

    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值