只需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. Session变量不能传送到下一页.解决: session.use_trans_sid = 1

    转自:http://blog.csdn.net/drylandfish/article/details/244085 附:文摘===================================== ...

  2. tcpdump抓包规则命令大全

    下面的例子全是以抓取eth0接口为例,如果不加”-i eth0”是表示抓取所有的接口包括lo. 1.抓取包含10.10.10.122的数据包 # tcpdump -i eth0 -vnn host 1 ...

  3. Handler 引起的内存泄露

    先看一组简单的代码 1 2 3 4 5 6 7 8 9 public class SampleActivity extends Activity { private final Handler mHa ...

  4. PAT (Basic Level) Practise:1039. 到底买不买

    [题目链接] 小红想买些珠子做一串自己喜欢的珠串.卖珠子的摊主有很多串五颜六色的珠串,但是不肯把任何一串拆散了卖.于是小红要你帮忙判断一下,某串珠子里是否包含了全部自己想要的珠子?如果是,那么告诉她有 ...

  5. FDR

    声明: 网上摘抄 False discovery rate (FDR) control is a statistical method used in multiple hypothesis test ...

  6. python 数据结构之单链表的实现

    链表的定义: 链表(linked list)是由一组被称为结点的数据元素组成的数据结构,每个结点都包含结点本身的信息和指向下一个结点的地址.由于每个结点都包含了可以链接起来的地址信息,所以用一个变量就 ...

  7. 137. Single Number II

    Given an array of integers, every element appears three times except for one. Find that single one. ...

  8. 150. Evaluate Reverse Polish Notation

    Valid operators are +, -, *, /. Each operand may be an integer or another expression. Some examples: ...

  9. CSS 阴影怎么写?

    只有CSS3才zh支持阴影效果,ke可以用如下写法:.shadow {-webkit-box-shadow:1px 1px 3px #292929;-moz-box-shadow:1px 1px 3p ...

  10. TCP通讯程序设计---5

    这里主要包含客户机和服务器的编程. 一.编程模型函数化 使用函数说明:socket的理解 服务器: 创建socket使用函数----->socket 绑定地址使用函数------->bin ...