文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>SilverLight控件拖动完美版

SilverLight控件拖动完美版

时间:2010-12-25  来源:fugitiver

       老规矩,我先给出关键代码:

 

窗口移动  #region 窗口移动

        static bool isSecect = false;//是否选中
        static Point startPoint = new Point();//开始坐标
        static FrameworkElement currentElement = null;//要拖动的控件
        //鼠标抬起
        public static void MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
        {
            if (isSecect)
            {
                currentElement.ReleaseMouseCapture();//移除鼠标捕获
            }
            isSecect = false;
        }

        //鼠标按下
        public static void MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            currentElement = (sender as FrameworkElement);//获取要拖动的控件
            currentElement.CaptureMouse();//鼠标捕获
            isSecect = true;//选中
            startPoint = e.GetPosition(null);//获取当前坐标
        }

        //鼠标移动
        public static void MouseMove(object sender, MouseEventArgs e)
        {
            if (isSecect)
            {
                Point pt = e.GetPosition(null);//获取当前坐标
                //判断距离下边框和右边框是否超过范围,为了防止拖出到容器外
                if (pt.Y - operation.page.ActualHeight < -30 & pt.X - operation.page.ActualWidth < -30)
                {
                    Matrix mx = (currentElement.RenderTransform as MatrixTransform).Matrix;
                    mx.OffsetX += pt.X - startPoint.X;//用当前坐标减去起始坐标获取移动距离
                    mx.OffsetY += pt.Y - startPoint.Y;//用当前坐标减去起始坐标获取移动距离
                    currentElement.RenderTransform = new MatrixTransform() { Matrix = mx };//重新移位
                    startPoint = pt;//把当前坐标获取为起始坐标
                }
            }
        }
        #endregion

 

        思路:

        其实移动的是鼠标,可以很方便获取鼠标相对于容器坐标,先定义鼠标点击左键后起始坐标startPoint,然后在移动过程中获取鼠标移动后的坐标,用移动后的坐标减去起始坐标就是相对位移,有了这个位移我们就可以控制控件移动的距离,横坐标和纵坐标是同样的道理,因为鼠标移动是个很迅速过程,所以有可能会出现控件跟不上的情况,但是肉眼很难察觉,当控件移动后,再次获取当前坐标为起始坐标startPoint,这样就形成一个循环。

        Matrix(有关Matrix的详细信息)是二维空间中的变换的 3x3 仿射变换矩阵,其中的OffsetX和OffsetY是横向和纵向位移,这样我们就可以利用这两个属性移动控件,其中我这里的判断if (pt.Y - operation.page.ActualHeight < -30 & pt.X - operation.page.ActualWidth < -30)
语句是为了防止拖出容器外的情况,其中的operation.page是我的容器,这里大家可以改成自己的容器。

        这段代码可以单独成类,把需要移动的控件三个事件指向这三个函数就可以了。

相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载