拼吾爱程序人生.Net编程Silverlight 一步一步学Silverlight 2系列(5):实现简单的拖放功能

1  /  1  页   1 跳转 查看:1250

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

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

文/Terrylee  出处/博客园

概述

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声明:

<Canvas Background="#46461F">
    <Button
      MouseLeftButt
      MouseMove="OnMouseMove"
      MouseLeftButtonUp="OnMouseUp"
      Canvas.Left="50" Canvas.Top="50" Background="Red"
      F
      Width="160" Height="80">
        <Button.Content>
            <StackPanel Orientation="Horizontal" Horiz
                        VerticalAlignment="Center">
                <Image Source="smile_6.png"></Image>
                <TextBlock Text="拖动我" VerticalAlignment="Center" Margin="10"></TextBlock>
            </StackPanel>
        </Button.Content>
    </Button>
</Canvas>

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

开始拖放操作

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

bool trackingMouseMove = false;
Point mousePosition;

void OnMouseDown(object sender, MouseButtonEventArgs e)
{
    FrameworkElement element = sender as FrameworkElement;
    mousePosition = e.GetPosition(null);
    trackingMouseMove = true;
    if (null != element)
    {
        element.CaptureMouse();
        element.Cursor = Cursors.Hand;
    }
}

移动对象

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

void OnMouseMove(object sender, MouseEventArgs e)
{
    FrameworkElement element = sender as FrameworkElement;
    if (trackingMouseMove)
    {
        double deltaV = e.GetPosition(null).Y - mousePosition.Y;
        double deltaH = e.GetPosition(null).X - mousePosition.X;
        double newTop = deltaV + (double)element.GetValue(Canvas.TopProperty);
        double newLeft = deltaH + (double)element.GetValue(Canvas.LeftProperty);

        element.SetValue(Canvas.TopProperty, newTop);
        element.SetValue(Canvas.LeftProperty, newLeft);

        mousePosition = e.GetPosition(null);
    }
}

 感谢原创者的辛勤劳动,希望对您有所帮助,转载请注明原出处。
 您可能对 [Silverlight] 的这些文章也感兴趣:

Silverlight 2 初览
Silverlight专题(8)-布局介绍
在Silverlight中读取指定URL图片包数据
Silverlight 2.0八月份宏大的部署计划
基于Visual Studio 2008 SP1的Silverlight 2工具发布
Silverlight的开发工具
Silverlight1.1中的事件处理
Object reference not set to an instance of an object
Silverlight vs Flash的技术比较
在Silverlight应用程序中进行数据验证
 

回复:一步一步学Silverlight 2系列(5):实现简单的拖放功能

完成拖放操作

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

void OnMouseUp(object sender, MouseButtonEventArgs e)
{
    FrameworkElement element = sender as FrameworkElement;
    trackingMouseMove = false;
    element.ReleaseMouseCapture();

    mousePosition.X = mousePosition.Y = 0;
    element.Cursor = null;
}

效果显示

最终,完成后的效果如下

 附件: 您所在的用户组无法下载或查看附件


拖动按钮

 附件: 您所在的用户组无法下载或查看附件


结束语

本文实现了一个简单的拖放功能(示例来自于Silverlight 2 SDK),点击下载文本示例代码:
 附件: 您所在的用户组无法下载或查看附件
 

回复:一步一步学Silverlight 2系列(5):实现简单的拖放功能

:~ :~ 不能动的。。。
 

回复:一步一步学Silverlight 2系列(5):实现简单的拖放功能

根本就不能动啊,跟踪MouseLeftButtonDown事件进去都不会执行
 

回复:一步一步学Silverlight 2系列(5):实现简单的拖放功能

不要用Button控件做,直接用Image控件做可以实现
 

回复:一步一步学Silverlight 2系列(5):实现简单的拖放功能

注意:该系列文章的环境是Beta 1!
 
1  /  1  页   1 跳转

快速回复帖子

标题
禁用 URL 识别
禁用表情
禁用 Discuz!NT 代码
使用个人签名
  [完成后可按 Ctrl+Enter 无刷新发布]  

版权所有 拼吾爱程序人生    

Powered by Discuz!NT 2.1.202   Copyright © 2001-2008 Comsenz Inc. 鄂ICP备07500843号
返顶部