当前位置: 首页 > news >正文

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

概述

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 
       MouseLeftButtonDown="OnMouseDown" 
       MouseMove="OnMouseMove"
       MouseLeftButtonUp="OnMouseUp" 
       Canvas.Left="50" Canvas.Top="50" Background="Red"
       FontSize="18"
       Width="160" Height="80">
        <Button.Content>
            <StackPanel Orientation="Horizontal" HorizontalAlignment="Center"
                        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);
    }
}

完成拖放操作

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

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

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

效果显示

最终,完成后的效果如下

TerryLee_Silverlight2_0035

拖动按钮

TerryLee_Silverlight2_0036

结束语

本文实现了一个简单的拖放功能(示例来自于Silverlight 2 SDK),点击下载文本示例代码。

相关文章:

  • iis报错
  • Xcode 添加 Cocos2d-x Scene 模板
  • java jdk下载与配置
  • 简单的javascript代码给页面一个奇迹
  • java常用四种排序源代码
  • Dave Python 练习二
  • 使Apache实现gzip压缩
  • Factory模式
  • 浏览器 制作---TWebBrowser 控件
  • Linux 下开启ssh服务(转)
  • [28期] lamp兄弟连28期学员手册,请大家务必看一下
  • Flex Actionscript 3 flash游戏 键盘 连招 连按 combo 同时按 事件处理
  • CAS实现SSO单点登录原理
  • windows 2008 r2 ad 优化
  • 为产品或者商品随机生成6位数的数字编码方案
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • 【跃迁之路】【733天】程序员高效学习方法论探索系列(实验阶段490-2019.2.23)...
  • Android框架之Volley
  • CentOS 7 防火墙操作
  • crontab执行失败的多种原因
  • CSS中外联样式表代表的含义
  • DOM的那些事
  • ES6之路之模块详解
  • Invalidate和postInvalidate的区别
  • JavaScript 无符号位移运算符 三个大于号 的使用方法
  • js数组之filter
  • Laravel5.4 Queues队列学习
  • mysql innodb 索引使用指南
  • node-sass 安装卡在 node scripts/install.js 解决办法
  • React 快速上手 - 06 容器组件、展示组件、操作组件
  • ReactNative开发常用的三方模块
  • Redis 懒删除(lazy free)简史
  • supervisor 永不挂掉的进程 安装以及使用
  • Vue 动态创建 component
  • 聚类分析——Kmeans
  • 如何打造100亿SDK累计覆盖量的大数据系统
  • 通过来模仿稀土掘金个人页面的布局来学习使用CoordinatorLayout
  • HanLP分词命名实体提取详解
  • Prometheus VS InfluxDB
  • 阿里云ACE认证之理解CDN技术
  • ​iOS实时查看App运行日志
  • ​LeetCode解法汇总2583. 二叉树中的第 K 大层和
  • ​Python 3 新特性:类型注解
  • #Js篇:单线程模式同步任务异步任务任务队列事件循环setTimeout() setInterval()
  • #Linux(帮助手册)
  • #预处理和函数的对比以及条件编译
  • (10)工业界推荐系统-小红书推荐场景及内部实践【排序模型的特征】
  • (C++)八皇后问题
  • (C语言)输入一个序列,判断是否为奇偶交叉数
  • (附源码)spring boot公选课在线选课系统 毕业设计 142011
  • (三) diretfbrc详解
  • (转)拼包函数及网络封包的异常处理(含代码)
  • .NET 指南:抽象化实现的基类
  • .net开源工作流引擎ccflow表单数据返回值Pop分组模式和表格模式对比
  • .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验