WPF 实现拖动工具箱效果

简介: 原文:WPF 实现拖动工具箱效果    1.效果   点击左边的矩形拖动到右边canvas面板,右边面板添加矩形  2.布局  左边是个StockPanel,上面有个矩形,右边是个Canvas面板。
原文: WPF 实现拖动工具箱效果

 

 

1.效果

  点击左边的矩形拖动到右边canvas面板,右边面板添加矩形

 2.布局

 左边是个StockPanel,上面有个矩形,右边是个Canvas面板。

 矩形是源,Canvas面板是目的,AllowDrop属性都要设成true,矩形框要有填充色,Canvas要有background,否则无法响应鼠标拖拽事件。

 3.矩形框点击事件

 

 private void rectangle1_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)

        {

            Rectangle rect = sender as Rectangle;

            //创建新矩形

            Rectangle temp = new Rectangle();

            temp.Width = rect.Width;

            temp.Height = rect.Height;

            temp.Fill = rect.Fill;

            temp.Stroke = rect.Stroke;

            //添加移动事件

            temp.MouseLeftButtonDown += new MouseButtonEventHandler(module_MouseLeftButtonDown);

            temp.MouseMove += new MouseEventHandler(module_MouseMove);

            temp.MouseLeftButtonUp += new MouseButtonEventHandler(module_MouseLeftButtonUp);

            DragDrop.DoDragDrop(temp, temp, DragDropEffects.Copy);

        }

 

 4.Canvas响应事件

 

private void canvas1_Drop(object sender, DragEventArgs e)

        {

            Rectangle r = (Rectangle)e.Data.GetData(typeof(Rectangle));

            Point p = e.GetPosition(canvas1);

            r.SetValue(Canvas.TopProperty, p.Y-r.Height/2);

            r.SetValue(Canvas.LeftProperty, p.X-r.Width/2);

            canvas1.Children.Add(r);

        }

5.Canvas内的矩形拖动

 

void module_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)

        {

            Rectangle rect = sender as Rectangle;

            mouseposition = e.GetPosition(canvas1);

            mousedown = true;

            rect.CaptureMouse();

        }

        void module_MouseMove(object sender, MouseEventArgs e)

        {

            Rectangle rect = sender as Rectangle;

            if (mousedown) {

                double deltav = e.GetPosition(canvas1).Y - mouseposition.Y;

                double deltah = e.GetPosition(canvas1).X - mouseposition.X;

                double newtop = deltav + (double)rect.GetValue(Canvas.TopProperty);

                double newleft = deltah + (double)rect.GetValue(Canvas.LeftProperty);

                rect.SetValue(Canvas.TopProperty, newtop);

                rect.SetValue(Canvas.LeftProperty, newleft);

                mouseposition = e.GetPosition(canvas1);

            }

        }

        void module_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)

        {

            Rectangle rect = sender as Rectangle;

            mousedown = false;

            rect.ReleaseMouseCapture();

            mouseposition.X = mouseposition.Y = 0;

        }

目录
相关文章
|
C#
WPF 界面实现多语言支持 中英文切换 动态加载资源字典
原文:WPF 界面实现多语言支持 中英文切换 动态加载资源字典 1、使用资源字典,首先新建两个字典文件en-us.xaml、zh-cn.xaml。定义中英文的字符串在这里面【注意:添加xmlns:s="clr-namespace:System;assembly=mscorlib】 zh-cn.
3194 0
|
C# 数据可视化 开发工具
WPF实现选项卡效果(1)——使用AvalonDock
原文:WPF实现选项卡效果(1)——使用AvalonDock 简介   公司最近一个项目,软件采用WPF开发,需要实现类似于VS的选项卡(或者是浏览器的选项卡)效果。
2262 0
|
3月前
|
C#
WPF 自定义可拖动标题栏
WPF 自定义可拖动标题栏
51 0
|
3月前
|
开发框架 前端开发 JavaScript
在WPF应用中使用GongSolutions.WPF.DragDrop实现列表集合控件的拖动处理
在WPF应用中使用GongSolutions.WPF.DragDrop实现列表集合控件的拖动处理
|
6月前
|
前端开发 C# 容器
浅谈WPF之控件拖拽与拖动
使用过office的visio软件画图的小伙伴都知道,画图软件分为两部分,左侧图形库,存放各种图标,右侧是一个画布,将左侧图形库的图标控件拖拽到右侧画布,就会生成一个新的控件,并且可以自由拖动。那如何在WPF程序中,实现类似的功能呢?今天就以一个简单的小例子,简述如何在WPF中实现控件的拖拽和拖动,仅供学习分享使用,如有不足之处,还请指正。
203 2
|
IDE C# 开发工具
WPF钟表效果实现
中WPF中的RotateTransform实现UI元素的旋转,并模拟钟表的秒针、分针和时针。
1197 0
WPF钟表效果实现
|
IDE 编译器 C#
WPF实现强大的动态公式计算
数据库可以定义表不同列之间的计算公式,进行自动公式计算,但如何实现行上的动态公式计算呢?行由于可以动态扩展,在某些应用场景下将能很好的解决实际问题。本文就探讨一下如何在WPF中实现一种基于行字段的动态公式计算。
1067 0
WPF实现强大的动态公式计算
|
网络协议 C# 移动开发
C# WPF上位机实现和下位机TCP通讯
C# WPF上位机实现和下位机TCP通讯下位机使用北京大华程控电源DH1766-1,上位机使用WPF。实现了电压电流实时采集,曲线显示。上午在公司调试成功,手头没有程控电源,使用TCP服务端模拟。昨天写的TCP服务端正好排上用场。
2404 0
|
C#
WPF特效-实现3D足球效果
原文:WPF特效-实现3D足球效果 WPF 实现 3D足球效果,效果图如下:  每个面加载不同贴图。                                                          ...
916 0
|
算法 C# 容器
WPF特效-实现弧形旋转轮播图
原文:WPF特效-实现弧形旋转轮播图        项目遇到,琢磨并实现了循环算法,主要处理循环替换显示问题       (如:12张图组成一个圆弧,但总共有120张图需要呈现,如何在滑动中进行显示块的替换,并毫无卡顿)        处理的自己感觉比较满意,记录一下。
2150 0