只需2个事件和一个point变量即可:

 Point mouse_offset = , );
         void TC_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
         {
             mouse_offset = Mouse.GetPosition(e.Source as FrameworkElement);
         }

         void TC_MouseMove(object sender, MouseEventArgs e)
         {
             FrameworkElement element = sender as FrameworkElement;

             if (e.LeftButton == MouseButtonState.Pressed)
             {
                 element.Cursor = Cursors.Hand;
                 Point mousePos = Mouse.GetPosition(e.Source as FrameworkElement);

                 double nTop = Canvas.GetTop(element) + mousePos.Y - mouse_offset.Y;

                 double nLeft = Canvas.GetLeft(element) + mousePos.X - mouse_offset.X;

                 //防止控件被拖出容器。
                 )
                     nTop = ;
                 if (nTop >= (CI.Height - element.DesiredSize.Height))
                     nTop = CI.Height - element.DesiredSize.Height;
                 )
                     nLeft = ;
                 if (nLeft >= (CI.Width - element.DesiredSize.Width))
                     nLeft = CI.Width - element.DesiredSize.Width;

                 Canvas.SetLeft(element, nLeft);
                 Canvas.SetTop(element, nTop);
             }
             else
             {
                 element.Cursor = null;
             }
         }

2014-09-15 Update:

后来发现,WPF当中用到界面变换的应用很多,所以,把这个抽象成一个类,如果要使用这些变换,只需要调用这个方法就可以了。

1、用于附加变换的类。

     public class RYMatrix
     {
         public RYMatrix(FrameworkElement Container,
             MouseButtonEventHandler MouseDown = null,
             MouseButtonEventHandler MouseUp = null,
             MouseWheelEventHandler MouseWheel = null,
             MouseEventHandler MouseMove = null)
         {
             Container.MouseDown -= Container_MouseDown;
             Container.MouseUp -= Container_MouseUp;
             Container.MouseWheel -= Container_MouseWheel;
             Container.MouseMove -= Container_MouseMove;

             Container.MouseDown += Container_MouseDown;
             Container.MouseUp += Container_MouseUp;
             Container.MouseWheel += Container_MouseWheel;
             Container.MouseMove += Container_MouseMove;

             this.MouseDown = MouseDown;
             this.MouseUp = MouseUp;
             this.MouseWheel = MouseWheel;
             this.MouseMove = MouseMove;
         }

         MouseButtonEventHandler MouseDown;
         MouseButtonEventHandler MouseUp;
         MouseWheelEventHandler MouseWheel;
         MouseEventHandler MouseMove;
         private bool CanRotate { get; set; }
         private Point RotatePoint { get; set; }
         private DateTime LastClick { get; set; }
         private Point LastPoint { get; set; }

         private void Container_MouseUp(object sender, MouseButtonEventArgs e)
         {
             RotatePoint = , -);
             if (CanRotate)
             {
                 CanRotate = false;
             }
             if (MouseUp != null)
                 MouseUp(sender, e);
         }
         private void Container_MouseDown(object sender, MouseButtonEventArgs e)
         {
             FrameworkElement FE = sender as FrameworkElement;
             if (FE == null)
                 return;
             Point p = e.MouseDevice.GetPosition(FE);
              && RotatePoint.Y == -))
             {
                 RotatePoint = p;
             }
             else if (Mouse.LeftButton == MouseButtonState.Pressed)
             {
                 )
                 {
                     Matrix m = FE.RenderTransform.Value;
                     m.ScaleAtPrepend(1.1, 1.1, p.X, p.Y);
                     FE.RenderTransform = new MatrixTransform(m);
                 }
                 LastClick = DateTime.Now;
                 LastPoint = p;
             }
             else if (Mouse.RightButton == MouseButtonState.Pressed)
             {
             }
             if (MouseDown != null)
                 MouseDown(sender, e);
         }
         private void Container_MouseWheel(object sender, MouseWheelEventArgs e)
         {
             FrameworkElement FE = sender as FrameworkElement;
             Point p = e.MouseDevice.GetPosition(FE);
             Matrix m = FE.RenderTransform.Value;
             )
                 m.ScaleAtPrepend(1.1, 1.1, p.X, p.Y);
             else
                 m.ScaleAtPrepend( /  / 1.1, p.X, p.Y);
             FE.RenderTransform = new MatrixTransform(m);
             if (MouseWheel != null)
             {
                 MouseWheel(sender, e);
             }
         }
         private void Container_MouseMove(object sender, MouseEventArgs e)
         {
             FrameworkElement FE = sender as FrameworkElement;
             Point NowPoint = e.GetPosition(FE);
             if (e.LeftButton == MouseButtonState.Pressed)
             {
                 double resultY = NowPoint.Y - LastPoint.Y + (double)FE.GetValue(Canvas.TopProperty);
                 double resultX = NowPoint.X - LastPoint.X + (double)FE.GetValue(Canvas.LeftProperty);
                 Matrix m = FE.RenderTransform.Value;
                 m.TranslatePrepend(resultX, resultY);
                 FE.RenderTransform = new MatrixTransform(m);
                 FE.Cursor = Cursors.Hand;
             }
             else
                  && RotatePoint.Y != -)
                 {
                     Matrix m = FE.RenderTransform.Value;
                     if (NowPoint.X > RotatePoint.X)
                     {
                         m.RotateAtPrepend(0.1, RotatePoint.X, RotatePoint.Y);
                     }
                     else if (NowPoint.X < RotatePoint.X)
                     {
                         m.RotateAtPrepend(-0.1, RotatePoint.X, RotatePoint.Y);
                     }
                     Debug.WriteLine(RotatePoint.X + "|" + RotatePoint.Y);
                     FE.RenderTransform = new MatrixTransform(m);
                     LastPoint = NowPoint;
                 }
                 else if (Mouse.RightButton == MouseButtonState.Pressed)
                 {
                     Matrix m = FE.RenderTransform.Value;
                     Debug.WriteLine(RotatePoint.X + "|" + RotatePoint.Y);
                     FE.RenderTransform = new MatrixTransform(m);
                     LastPoint = NowPoint;
                 }
                 else
                 {
                     FE.Cursor = null;
                 }
             if (MouseMove != null)
             {
                 MouseMove(sender, e);
             }
         }
     }

2、调用这个类的前端页面:

 <Window x:Class="WPFClient.MainWindow"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         Title="MainWindow" Loaded="Window_Loaded">
     <Grid>
         <Canvas x:Name="Container"/>
     </Grid>
 </Window>

3、后台代码:

private void Window_Loaded(object sender, RoutedEventArgs e)
{
    Canvas CI = new Canvas();
    Canvas.SetTop(CI, );
    Canvas.SetLeft(CI, );
    Image I = new Image();
    I.Source = new BitmapImage(new Uri("http://d.hiphotos.baidu.com/image/pic/item/00e93901213fb80e68fd3dd734d12f2eb9389485.jpg", UriKind.Absolute));
    CI.Children.Add(I);
    new RuyeeSoft.WPF.UIProcess.RYMatrix(CI,null,new MouseButtonEventHandler((o,d)=>{ MessageBox.Show("xx");}));
}

WPF拖到、移动控件的更多相关文章

  1. WPF拖拽文件(拖入拖出),监控拖拽到哪个位置,类似百度网盘拖拽

    1.往wpf中拖文件 // xaml <Grid x:Name="grid_11" DragOver="Grid_11_DragOver" Drop=&q ...

  2. wpf 拖图片到窗体

    前台代码:<Window x:Class="拖拽.MainWindow"        xmlns="http://schemas.microsoft.com/wi ...

  3. wpf拖拽

    简单拖拽的实现是,实现源控件的MouseDown事件,和目标控件Drop事件.调用DragDrop.DoDragDrop()以启动拖放操作,DragDrop.DoDragDrop()函数接受三个参数: ...

  4. 【WPF】拖拽ListBox中的Item

    整理了两个关于WPF拖拽ListBox中的Item的功能.项目地址 https://github.com/Guxin233/WPF-DragItemInListBox 需求一: 两个ListBox,拖 ...

  5. WPF拖动总结[转载]

    WPF拖动总结   这篇博文总结下WPF中的拖动,文章内容主要包括: 1.拖动窗口 2.拖动控件 Using Visual Studio 2.1thumb控件 2.2Drag.Drop(不连续,没有中 ...

  6. [转载]WPF控件拖动

    这篇博文总结下WPF中的拖动,文章内容主要包括: 1.拖动窗口 2.拖动控件 Using Visual Studio 2.1thumb控件 2.2Drag.Drop(不连续,没有中间动画) 2.3拖动 ...

  7. wpf图片查看器,支持鼠标滚动缩放拖拽

    最近项目需要,要用到一个图片查看器,类似于windows自带的图片查看器那样,鼠标滚动可以缩放,可以拖拽图片,于是就写了这个简单的图片查看器. 前台代码: <Window x:Class=&qu ...

  8. WPF如何实现拖拽打开文件(将文件拖进窗体打开)

    在WPF中的实现和WinForm中的实现99%相似,将要实现接受拖拽释放的控件添加DragEnter事件和Drop事件,本例中控件Grid grid作为接受控件,添加事件操作如下: private v ...

  9. WPF.UIShell UIFramework之自定义窗口的深度技术 - 模态闪动(Blink)、窗口四边拖拽支持(WmNCHitTest)、自定义最大化位置和大小(WmGetMinMaxInfo)

    无论是在工作和学习中使用WPF时,我们通常都会接触到CustomControl,今天我们就CustomWindow之后的一些边角技术进行探讨和剖析. 窗口(对话框)模态闪动(Blink) 自定义窗口的 ...

随机推荐

  1. 性能测试之-wrk(转)

    转载地址:http://zjumty.iteye.com/blog/2221040 测试先行是软件系统质量保证的有效手段. 在单元测试方面, 我们有非常成熟的 xUnit 方案. 在集成测试方面, 我 ...

  2. Core Java Volume I — 4.1. Introduction to Object-Oriented Programming

    4.1. Introduction to Object-Oriented ProgrammingObject-oriented programming, or OOP for short, is th ...

  3. java CAS

    在Doug Lea提供的cucurenct包 (J.U.C)中,CAS理论是实现整个java包的基石.   Compare and Swap 在这里,CAS 指的是现代 CPU 广泛支持的一种对内存中 ...

  4. Ubuntu下adb的安装

    1.adb简述: adb全称Android Debug Bridge,安卓调试桥接器.它是Android sdk里的一个工具,用这个工具可以直接操作管理android模拟器或者真实的andriod设备 ...

  5. Java线程的生命周期

    线程的生命周期包括:新建(New).就绪(Runnable).运行(Running).阻塞(Blocked)和死亡(Dead)5种状态.线程状态转换图如下: 1.新建状态(New) 当程序使用new关 ...

  6. 转载:为什么要对URI进行编码

            为什么需要Url编码,通常如果一样东西需要编码,说明这样东西并不适合传输.原因多种多样,如Size过大,包含隐私数据,对于Url来说,之所以要进行编码,是因为Url中有些字符会引起歧义 ...

  7. tyvj1015 - 公路乘车 ——完全背包

    题目链接:https://www.tyvj.cn/Problem_Show.aspx?id=1015 完全背包 #include <cstdio> #include <algorit ...

  8. 使用密钥验证方式登录linux系统

    1.使用PuTTY工具PuTTYgen生成密钥对,打开PuTTYgen,点击Generate生成公钥(生成过程动动鼠标会提升进度哦). 2.将公钥(蓝色的是私钥)放到服务器上去: -在/root目录下 ...

  9. hadoop常用管理员命令

    hadoop job -list 列出正在运行的job hadoop job -kill kill掉job hadoop fsck 检查HDFS坏快 hadoop dfsadmin -report检查 ...

  10. Python学习(2)——编码

    今天写了个程序但是在DOS窗口和IDEL窗口调试的结果不一样,有些郁闷~ #!/usr/bin/env python #coding=utf-8 #python version:2.7.3 #syst ...