关于WPF的拖拽(1让我们拖拽吧!)
主题:
1.让我们拖拽吧!
2.什么,拖拽时还要缩略图?。。。
3.拖拽时的部件重叠(一个萝卜一个坑,请不要占我的坑)
引子:
BOSS:为啥你的程序不支持拖拽?
我:因为我不会拖拽。。。
BOSS:我每月给你的¥都TMD喂狗了啊。。。
上帝说:我要光,所以有了光。
BOSS说:我要拖拽,于是有了拖拽!
正文:
1.让我们拖拽吧!
话说,WPF,要实现拖拽还是比较简单的。
首先是素材,你得有个拖拽的容器,还要有一些拖拽的部件。
然后无非就是以下几个步骤。
对于想要拖拽的部件
(1)你先得给他弄上MouseMove and MouseLeftButtonDown事件
(2)你还得弄个DataObject包含你拖拽时的数据和你想要的效果
(3)然后调用DragDrop.DoDragDrop()吧
对于容器
(1)你要把它的AllowDrop 设置为true,这样你的容器才能被人随便的丢垃圾进去。
(2)当然,你还得加上DragEnter 事件,拖动进入了你的容器时会发生这个事件。
(3)最后,不要忘记加上DragDrop 事件,它会告诉你有某个部件被扔下来了。
好了,说了这么多,还是弄点代码上来吧。
我们自定义一些UserControl代表部件,容器就使用Canvas,因为Canvas能够很好的定位内部的部件位置。
下面是代码
Container的XMAL

<component:Component x:Name="component1" Canvas.Top="30" Canvas.Left="30" PreviewMouseLeftButtonDown="component1_PreviewMouseLeftButtonDown" PreviewMouseMove="component1_PreviewMouseMove">
</component:Component>
</Canvas>
Component的XMAL

<DockPanel Margin="10">
<TextBlock FontSize="20" FontWeight="Bold" FontStyle="Normal">
I am a container!
</TextBlock>
</DockPanel>
</Border>
主窗体CS文件

this.container.DragEnter += new DragEventHandler((sender, e) =>
{
e.Effects = DragDropEffects.None;
}
);
this.container.Drop += new DragEventHandler((sender, e) =>
{
//get the object
var component = e.Data.GetData(typeof(Component)) as Component;
var endPoint = e.GetPosition(container);
//calculate the length of component moved
var moveX = endPoint.X - startPoint.X;
var moveY = endPoint.Y - startPoint.Y;
var x = Canvas.GetLeft(component) + moveX;
var y = Canvas.GetTop(component) + moveY;
Canvas.SetLeft(component, x);
Canvas.SetTop(component, y);
}
);
private Point startPoint;
private void component1_PreviewMouseMove(object sender, MouseEventArgs e)
{
// Get the current mouse position
Point mousePos = e.GetPosition(null);
Vector diff = startPoint - mousePos;
if (e.LeftButton == MouseButtonState.Pressed &&
Math.Abs(diff.X) > SystemParameters.MinimumHorizontalDragDistance &&
Math.Abs(diff.Y) > SystemParameters.MinimumVerticalDragDistance)
{
// Initialize the drag & drop operation
var component = sender as Component;
DataObject obj = new DataObject(typeof(Component), component);
DragDrop.DoDragDrop(component, obj, DragDropEffects.All);
}
}
private void component1_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
startPoint = e.GetPosition(container);
}
搞定!
总结:至于什么ListView,TreeView的拖拽也都大同小异,无非就是拖拽的部件和容器变化。
可以参考这个文章
http://www.codeproject.com/KB/WPF/WpfDragAndDropSmorgasbord.aspx
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 单线程的Redis速度为什么快?
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 展开说说关于C#中ORM框架的用法!
· SQL Server 2025 AI相关能力初探
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库