【WPF】一些拖拽实现方法的总结(Window,UserControl)

原文地址 https://www.cnblogs.com/younShieh/p/10811456.html

❤如果本文对你有所帮助,不妨点个关注和推荐呀,这是对笔者最大的支持~❤

前文

  • 本文只对笔者学习掌握的一般的拖动问题的实现方法进行整理和讨论,包括窗口、控件等内容的拖动。
  • 希望本文能对一些寻找此问题的解决方法的人和一些刚入门的人一些帮助,能得到各位的批评指正也是荣幸万分。有更好的方法,劳烦与我分享,不胜感激。
  • 本文的各种实现方法其它博客中也都有涉及,很多文章内容详实,有图有代码,笔者就不重复造轮子了。就写写自己的一些理解吧。

正文

1. 窗口的拖拽

 我们知道,鼠标放在窗口的标题栏上按下就可以拖动窗体。我们要实现在窗口的全部地方或特定地方按下鼠标左键实现拖动。

【推荐】 使用 DragMove()方法,可以完全胜任。

private void Grid_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
   DragMove();
}

Grid就是你的标题栏啥的。
使用参考: http://www.cnblogs.com/DebugLZQ/archive/2013/05/07/3062733.html

需要注意的是,非主鼠标按钮按下时候会导致拖动程序出现异常报错。所以最好catch一下。

private void Grid_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    try{
     DragMove();
    }catch(Exception){ }
}


其它:

  1. 自定义标题栏,使用WindowChrome
    适用于无边框自定义窗体,又不想去实现双击全屏,标题栏右键菜单的情况。简称比较懒得情况。(个人感觉使用起来感觉可控性不是很好,还是自己重新设计舒服。ヽ(ー_ー)ノ
  2. 利用SendMessage实现窗口拖动
    适用于。。。我也不是很清楚,没咋用过(`・ω・´)。原理就是通过向窗口发送API User32中包含的移动命令来实现移动。学习学习。
    使用参考: https://www.cnblogs.com/zhouyinhui/archive/2009/08/28/1555870.html

2.控件的拖拽

【推荐】 使用Blend中的行为来实现拖动

  强大的VS Blend提供了实现拖拽的行为(behavior),不用自己去计算和完成具体实现,使用起来极为方便,真正实现“点一下玩一年”,非常适合我这种懒人。

  使用参考: https://www.cnblogs.com/YGYH/archive/2010/09/10/1822724.html

  问题:这个拖拽行为虽然使用起来方便,但是只适用于子控件在父容器中拖拽的情况。

其它:

  1. 通过RenderTransform的TranslateTransform属性实现,在二维 x-y 坐标系统内平移(移动)对象。
    RenderTransform属性可以实现界面的转换、旋转、缩放、倾斜、翻转等各种功能。所以我们只需要获得拖拽时改变的值后,就能对各种控件进行位置转换。
<Image>
    <Image.RenderTransform>
        <TransformGroup>
            <TranslateTransform X="100"/>
        </TransformGroup>
    </Image.RenderTransform>
</Image>

  使用参考: https://blog.csdn.net/qq_18995513/article/details/72765269#

  1. 【推荐】Thumb控件。Thumb表示可由用户拖动的控件。
    依赖于父容器进行使用,可以通过控件拖动时的属性值就能获取控件的垂直变化量和水平变化量。拖动DeltaEventArgs类在使用时,可以将按钮、图片等需要实现拖拽的内容放到Thumb下,通过拖拽Thumb来实现内容物的拖拽。
private void DragDelta(object sender, System.Windows.Controls.Primitives.DragDeltaEventArgs e)
{
   Canvas.SetLeft(thumb1,Canvas.GetLeft(thumb1)+e.HorizontalChange);
   Canvas.SetTop(thumb1, Canvas.GetTop(thumb1) + e.VerticalChange);
}

参考学习这篇博文的2.1项

  1. Canvas容器中的子控件,通过点击下时记录的点,然后计算移动时的点的变化量,来重新计算子控件与父容器的相对位置。参考学习这篇博文的2.3项
  2. Grid容器中的子控件拖拽的实现方法与Canvas大同小异,参考学习这篇博文的2.4项

后文

  以上应该就是在WPF中的各种拖拽的实现方法了,有简单的,也有复杂的。具体使用哪个,应该还是要根据使用需求来用。不过常用的就那几个(逃~


参考资料

http://www.cnblogs.com/DebugLZQ/archive/2013/05/07/3062733.html

这篇文章的介绍非常全面,基本覆盖了所有拖动方法。值得学习参考。

posted on 2019-05-05 10:05  Nicccck  阅读(4217)  评论(0编辑  收藏  举报

导航