实例地址:WPFThumb、控件、窗体、内容拖动实例-C#文档类资源-CSDN下载

WPF常见拖动方式:

1、窗体拖动:使用窗体自带拖动方法,DragMove()。

2、Thumb控件拖动:WPF拖动控件,MSDN的描述,Represents a control that can be dragged by the user.(表示可由用户拖动的控件),由DragStarted、DragDelta、DragCompleted着三个事件完成控件的拖动。

3、控件内容拖动:修改控件的AllowDrop属性,AllowDrop=true,允许拖动。

4、Shape拖动:在Canvas上拖动,记录鼠标位置并实时设置Shape位置。

5、控件拖动:需要用AddHandler添加Button.MouseLeftButtonDown等事件,不然无法触发,因为Button.Clicked事件Supress掉了MouseLeftButtonDown。(两种方式:1.在Canvas上拖动 2.在Grid上拖动)

窗体拖动:

<!--xaml代码-->
<Window x:Class="DragDemo.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:local="clr-namespace:DragDemo"mc:Ignorable="d"Title="窗体拖动" Height="450" Width="800" MouseLeftButtonDown="Window_MouseLeftButtonDown">
</Window>/// <summary>
/// 窗体拖动后台端代码
/// </summary>
public partial class MainWindow : Window
{public MainWindow(){InitializeComponent();}private void Window_MouseLeftButtonDown(object sender, MouseButtonEventArgs e){this.DragMove();}
}

Thumb控件拖动:

<!--xaml代码-->
<Window x:Class="DragDemo.ThumbDragWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:local="clr-namespace:DragDemo"mc:Ignorable="d"Title="Thumb拖动" Height="450" Width="800"><Canvas><Thumb Name="thumb1" Background="Green" Height="50" Width="100" DragDelta="DragDelta" DragStarted="DragStarted" DragCompleted="DragCompleted" Canvas.Left="335" Canvas.Top="121"></Thumb></Canvas>
</Window>/// <summary>
/// Thumb拖动后端代码
/// </summary>
public partial class ThumbDragWindow : Window
{/*DragDelta——当 Thumb 控件具有逻辑焦点和鼠标捕获时,随着鼠标位置更改发生一次或多次。DragStarted——在 Thumb 控件接收逻辑焦点和鼠标捕获时发生。DragCompleted——在 Thumb 控件失去鼠标捕获时发生。*/public ThumbDragWindow(){InitializeComponent();}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);}private void DragStarted(object sender, System.Windows.Controls.Primitives.DragStartedEventArgs e){thumb1.Background = Brushes.Red;}private void DragCompleted(object sender, System.Windows.Controls.Primitives.DragCompletedEventArgs e){thumb1.Background = Brushes.Green;}
}

控件内容拖动:

<!--xaml代码-->
<Window x:Class="DragDemo.ContentDropWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:local="clr-namespace:DragDemo"mc:Ignorable="d"Title="ContentDropWindow" Height="450" Width="800"><Grid><Label Name ="label1" Content="TestDrop" Background="Red" Height ="28" HorizontalAlignment="Left" Margin="166,157,0,0"  VerticalAlignment="Top" MouseDown="label1_MouseDown" RenderTransformOrigin="0.54,-0.431"  /><Label Name="label2"  Content="ToHere"  Background="Green" Height="28" HorizontalAlignment="Left" Margin ="400,256,0,0"  VerticalAlignment="Top" AllowDrop ="True" Drop="tagert_drop"   /><TextBox Width="100" Height="30" Margin="375,97,317,292" /></Grid>
</Window>/// <summary>
/// 控件内容拖动
/// </summary>
public partial class ContentDropWindow : Window
{public ContentDropWindow(){InitializeComponent();}//拖拽label1到label上,把label1的text赋值给label2private void label1_MouseDown(object sender, MouseButtonEventArgs e){System.Windows.Controls.Label lbl = (System.Windows.Controls.Label)sender;DragDrop.DoDragDrop(lbl, lbl.Content, System.Windows.DragDropEffects.Copy);}private void tagert_drop(object sender, System.Windows.DragEventArgs e){((System.Windows.Controls.Label)sender).Content = e.Data.GetData(System.Windows.DataFormats.Text);}
}

Shape拖动:

<!--xaml代码-->
<Window x:Class="DragDemo.ShapeDragInCanvas"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:local="clr-namespace:DragDemo"mc:Ignorable="d"Title="ShapeDragInCanvas" Height="450" Width="800"><Canvas x:Name="canvas1" Background="Green"><Canvas  Background="Yellow" Canvas.Left="85" Canvas.Top="51" Height="100" Name="canvas2" Width="105" MouseLeftButtonDown="canvas2_MouseDown"   MouseMove="canvas2_MouseMove" MouseLeftButtonUp="canvas2_MouseLeftButtonUp"><Button x:Name="btn" Width="100" Height="30" Canvas.Top="20"  Click="btn_Click"/></Canvas></Canvas>
</Window>/// <summary>
/// Shape,Canvas 在Canvas中拖动后台代码
/// </summary>
public partial class ShapeDragInCanvas : Window
{public ShapeDragInCanvas(){InitializeComponent();}Point oldPoint = new Point();bool isMove = false;private void canvas2_MouseMove(object sender, MouseEventArgs e){if (isMove){//canvas2.Background = Brushes.White;FrameworkElement currEle = sender as FrameworkElement;if (currEle.GetType() == typeof(Canvas)){double xPos = e.GetPosition(null).X - oldPoint.X + (double)currEle.GetValue(Canvas.LeftProperty);double yPos = e.GetPosition(null).Y - oldPoint.Y + (double)currEle.GetValue(Canvas.TopProperty);currEle.SetValue(Canvas.LeftProperty, xPos);currEle.SetValue(Canvas.TopProperty, yPos);}else{var temp = VisualTreeHelper.GetParent(currEle);var temp1 = VisualTreeHelper.GetChild(currEle, 1);}oldPoint = e.GetPosition(null);}}private void canvas2_MouseDown(object sender, MouseButtonEventArgs e){isMove = true;oldPoint = e.GetPosition(null);}private void canvas2_MouseLeftButtonUp(object sender, MouseButtonEventArgs e){isMove = false;//canvas2.Background = Brushes.Yellow;}       private void btn_Click(object sender, RoutedEventArgs e){Point sidebarPoint = this.PointToScreen(new Point(this.ActualWidth, this.ActualHeight));}
}

控件拖动:1.在Canvas上拖动 2.在Grid上拖动

1.在Canvas上拖动控件:

<!--xaml代码-->
<Window x:Class="DragDemo.ControlDragInCanvas"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:local="clr-namespace:DragDemo"mc:Ignorable="d" Title="ControlDragInCanvas" Height="450" Width="800"><Canvas x:Name="canvas1" Background="Green"><Button  x:Name="btn" Background="Yellow" Canvas.Left="85" Canvas.Top="51" Height="50"  Width="105" /></Canvas>
</Window>/// <summary>
/// 控件在Canvas中拖动
/// </summary>
public partial class ControlDragInCanvas : Window
{public ControlDragInCanvas(){InitializeComponent();btn.AddHandler(Button.MouseLeftButtonDownEvent, new MouseButtonEventHandler(Element_MouseLeftButtonDown), true);btn.AddHandler(Button.MouseMoveEvent, new MouseEventHandler(Element_MouseMove), true);btn.AddHandler(Button.MouseLeftButtonUpEvent, new MouseButtonEventHandler(Element_MouseLeftButtonUp), true);btn.MouseMove += new MouseEventHandler(Element_MouseMove);btn.MouseLeftButtonDown += new MouseButtonEventHandler(Element_MouseLeftButtonDown);btn.MouseLeftButtonUp += new MouseButtonEventHandler(Element_MouseLeftButtonUp);}bool isDragDropInEffect = false;Point pos = new Point();void Element_MouseMove(object sender, MouseEventArgs e){if (isDragDropInEffect){FrameworkElement currEle = sender as FrameworkElement;double xPos = e.GetPosition(null).X - pos.X + (double)currEle.GetValue(Canvas.LeftProperty);double yPos = e.GetPosition(null).Y - pos.Y + (double)currEle.GetValue(Canvas.TopProperty);currEle.SetValue(Canvas.LeftProperty, xPos);currEle.SetValue(Canvas.TopProperty, yPos);pos = e.GetPosition(null);}}void Element_MouseLeftButtonDown(object sender, MouseButtonEventArgs e){FrameworkElement fEle = sender as FrameworkElement;isDragDropInEffect = true;pos = e.GetPosition(null);fEle.CaptureMouse();fEle.Cursor = Cursors.Hand;}void Element_MouseLeftButtonUp(object sender, MouseButtonEventArgs e){if (isDragDropInEffect){FrameworkElement ele = sender as FrameworkElement;isDragDropInEffect = false;ele.ReleaseMouseCapture();}}
}

2.在Grid上拖动控件

<!--xaml代码-->
<Window x:Class="DragDemo.ControlDragInGrid"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:local="clr-namespace:DragDemo"mc:Ignorable="d"Title="ControlDragInGrid" Height="450" Width="800"><Grid><Button x:Name="btn" Content="DragButton" Width="120" Height="40" Background="Green"/></Grid>
</Window>/// <summary>
/// 控件在Grid中拖动
/// </summary>
public partial class ControlDragInGrid : Window
{bool isDragDropInEffect = false;Point pos = new Point();public ControlDragInGrid(){InitializeComponent();//需要用AddHandler添加Button.MouseLeftButtonDown等事件,不然无法触发,因为Button.Clicked事件Supress掉了MouseLeftButtonDown。btn.AddHandler(Button.MouseLeftButtonDownEvent, new MouseButtonEventHandler(btn_MouseLeftButtonDown), true);btn.AddHandler(Button.MouseMoveEvent, new MouseEventHandler(btn_MouseMove), true);btn.AddHandler(Button.MouseLeftButtonUpEvent, new MouseButtonEventHandler(btn_MouseLeftButtonUp), true);}private void btn_MouseLeftButtonDown(object sender, MouseButtonEventArgs e){Button fEle = sender as Button;isDragDropInEffect = true;pos = e.GetPosition(null);fEle.CaptureMouse();fEle.Cursor = Cursors.Hand;}private void btn_MouseLeftButtonUp(object sender, MouseButtonEventArgs e){if (isDragDropInEffect){Button ele = sender as Button;isDragDropInEffect = false;ele.ReleaseMouseCapture();}}private void btn_MouseMove(object sender, MouseEventArgs e){if (isDragDropInEffect){Button currEle = sender as Button;double xPos = e.GetPosition(null).X - pos.X + currEle.Margin.Left;double yPos = e.GetPosition(null).Y - pos.Y + currEle.Margin.Top;currEle.Margin = new Thickness(xPos, yPos, 0, 0);pos = e.GetPosition(null);}}
}

参考:https://www.cnblogs.com/m7777/p/7110402.html

WPF Thumb、控件、窗体、内容、Shape拖动相关推荐

  1. WPF 表格控件 ReoGrid 的简单使用

    WPF 表格控件 ReoGrid 的简单使用 目录 一.概述 二.安装 三.添加控件 四.加载 Excel 五.属性设置 六.支持触摸滚动 七.其它操作 1.显示和隐藏列 2.显示特定字体 八.资源链 ...

  2. WPF 滚动条控件ScrollViewer的使用及自定义滚动条控件(一)

    WPF 滚动条控件ScrollViewer的使用及自定义滚动条控件(一) 首先看一下两种空间的运行效果: 左边是自定义滑条控件,右边是自带的滑条控件: **滑条使用方法:**我们在ScrollView ...

  3. WPF(一) WPF基本控件与布局

    ​ WPF(Windows Presentation Foundation)是微软推出的基于Windows的用户界面框架,中文译为"Windows呈现基础",属于.NET Fram ...

  4. WPF 用户控件分享之边上带输入框的圆圈

    WPF 用户控件分享之边上带输入框的圆圈 独立观察员 2022 年 8 月 20 日 最近有这样一个需求,有一圈圆形,每个圆形边上有个输入框,以下是完成后的效果图: 拿到这个需求后,分析界面上每个圆形 ...

  5. OxyPlot.Wpf 图表控件使用备忘

    OxyPlot.Wpf 图表控件使用备忘 目录 OxyPlot.Wpf 图表控件使用备忘 一.OxyPlot.Wpf 控件信息 二.基本概念 (一) PlotView 和 Plot (二) PlotM ...

  6. VB让控件可以当标题栏拖动

    '运用本段代码可以使任意控件像窗体标题栏一样具有拖动窗体的功能? '先在模块中加入以下代码: Public Declare Function ReleaseCapture Lib "user ...

  7. WPF 第三方控件主题库

    WPF 第三方控件主题库 一.MaterialDesigonToolkit 开源项目:https://github.com/MaterialDesignInXAML/MaterialDesignInX ...

  8. WPF TabControl控件示例

    WPF TabControl控件示例 运行效果: 主窗体XAML代码: <Window x:Class="WPF0417.MainWindow"xmlns="htt ...

  9. C# WPF 歌词控件(支持逐字定位描色效果)

    C# WPF 歌词控件(支持逐字定位描色效果) 原文:C# WPF 歌词控件(支持逐字定位描色效果) 之前做了一个模仿网易云歌词的控件,实现了加载网易云歌词并能随音乐播放进度定位歌词.今天呢将在这个控 ...

  10. WPF DataGrid控件的使用

    WPF DataGrid控件的使用 下面以一个例子说明DataGrid控件的使用方法: 一.程序框架 使用了MVVM Light框架 二.主要代码部分(使用MVVM Light框架): 1.主窗体xa ...

最新文章

  1. java富文本编辑器KindEditor
  2. 关闭子窗口刷新父窗口
  3. 在VS2010下使用 UNICODE 和 ANSI 的混合编程
  4. Linux下Tomcat重新启动以及日志
  5. [译]Chipmunk 教程2 - 基本概念
  6. ITK:追加两个3D体积
  7. python plt调整子图间隔
  8. [OpenCV+VS2015]火焰检测算法(RGB判据)
  9. LaTeX排版_jlreq模板_文库本(A6)竖版
  10. Opencvchina网站:把证件照蓝色背景转为白色
  11. Myeclipes 10 cracker.jar破解文件指定路径错误
  12. [vuex] expects string as the type, but found object.
  13. Linux怎么解决更改xx权限:不允许的操作
  14. oeasy教您玩转vim - 27 - 文件类型
  15. 基于Java毕业设计疫情下的居民管理系统源码+系统+mysql+lw文档+部署软件
  16. CentOS 7.6的64位安装JAVA JDK
  17. M-estimator
  18. MVC、MVP、MVI、MVVM 和 VIPER 设计模式
  19. 发邮件时提示连接服务器失败,发送邮件时经常出现发送失败或是连接超时什么原因...
  20. Excel总VBA相关类模块

热门文章

  1. 测试电磁波仪软件,电磁波辐射检测仪的使用方法_电磁辐射检测仪工作原理与应用...
  2. 学习表——受任于败军之际,奉命于危难之间(11.28-12.4)
  3. Python itchat模块报错:为了你的帐号安全,此微信号不能登录网页微信。你可以使用Windows微信或Mac微信在电脑端登录。
  4. 开发一款好玩的地图app
  5. linux导出mysql表数据
  6. 报错:java.net.bindexception: address already in use: jvm_bind:8082
  7. React+Redux技术栈核心要点解析(下篇)
  8. 奥运门票可以网上卖,火车票为什么不行
  9. 某互联网银行 区块链技术暑假实习生在线笔试 回忆
  10. linux虚拟机和主机的文件拷贝