WPF 矩形框8个控制点伸缩及拖拽

本文介绍了如何在WPF中实现图片控件矩形框的8个控制点拖拽和伸缩功能,详细讲解了实现过程,包括直接拖动移动、控制条拖拉伸缩以及最小裁剪区域限制。提供的解决方案强调可移植性和轻量级,适合学习和项目应用。
摘要由CSDN通过智能技术生成

           最近在研发图片控件矩形框8个控制点进行控制边框的大小、位置等信息,之前查阅了相关的信息,比如别人整合的类:ControlResizer 这个类虽然是好,但是很大程度上是有限制,换句话说,它需要你二次更改代码和调整成适应你的代码结构,否则很多边框拖拉的时候无法使用,这也是当时使用的时候很头疼的事情,废话不多说,先上效果图:

       

如上图所示,分析下:有四个层,第一层是主窗体,第二层是传入的图片控件,第三层是遮罩、第四层也就是控制层(图中显示的可操作的蓝色区域,以下称为裁剪区),注意实现的效果是:

      1、直接拖拽移动裁剪区,不能跑到图片外面,并且在裁剪区之外的所有区域需要实时重新蒙上遮罩。

      2、拖拉图中的8个裁剪区蓝色控制条,要实现控制条相关方向上的任意拖拉实现伸缩,并且有最小裁剪区域。

      3、能根据传入的图片控件信息(图中的包括宽-高-角度(30°),位置信息)进行定位和裁剪。

下面提供个人的方案进行参考,不一定是最佳方案,不过比对了很多人的控制点方案,我觉得这个可移植性比较高,适用于轻量级的操作,网上的都是各种类与类引用,然后一堆的与Windows自带的东西结合比如Thumb类。相对复杂。不利于学习研究之用,总之我们只要掌握了原理,接下来解决问题就是比较容易。

    解决方案步骤:

     一:创建构造函数(模拟图片控件信息,实际项目中可自行传入信息仅供参考)。

     示例:

     /// <summary>
        /// 构造一个图片控件函数包含位置、角度等信息
        /// </summary>
        public class StructureSource
        {
            public Point Images_Point { get; set; }
            public double ImageAngle;
            public double ImageHeight;
            public double ImageWidth;
            public BitmapImage ImageSource;


            public StructureSource()
            {
                Images_Point = new Point(200, 100);
                ImageAngle = 30.0;
                ImageSource = new BitmapImage(new Uri("C:\\Users\\Administrator\\Desktop\\CompanyLogo\\XXX.PNG"));
                ImageHeight = ImageSource.Height;
                ImageWidth = ImageSource.Width;
            }
        }

     二:准备主窗体,主窗体需要准备好结构,前面提到了这种伸缩性的功能,它需要放在Canvas容器中进行操作,所以一定要注意它的结构性。

     三:准备好一个用户控件(在图中是蓝色控制条部分)。

     四:初始化主窗体,包含根据图片信息定位,角度等,遮罩,进行裁剪。

    示例:

this.Loaded += (sender, ex) =>
             {
                 ImageItem = new StructureSource();
                 this._Images.Source = ImageItem.ImageSource;
                 this._Images.Height = ImageItem.ImageHeight;
                 this._Images.Width = ImageItem.ImageWidth;
                 //定位+旋转角度
                 Matrix m = this._Images.RenderTransform.Value;
                 m.OffsetX = ImageItem.Images_Point.X;
                 m.OffsetY = ImageItem.Images_Point.Y;
                 m.RotateAt(ImageItem.ImageAngle, ImageItem.Images_Point.X, ImageItem.Images_Point.Y);
                 this._Images.RenderTransform = new MatrixTransform(m);
                 //设置背景为黑色
                 _GridBackGround.Background = Brushes.Black;
                 //添加内容
                 _ContentObject = new CuttingControl();
                 _Content.Children.Add(_ContentObject);
                 _ContentObject.SizeChanged += _ContentObject_SizeChanged;
                 _ContentObject.BackGroundDrag += _ContentObject_BackGroundDrag;
                 _Content.Height = ImageItem.ImageHeight;
                 _Content.Width = ImageItem.ImageWidth;
                 //定位+翻转角度
                 Matrix m2 = this._Content.RenderTransform.Value;
                 m2.OffsetX = ImageItem.Images_Point.X;
                 m2.OffsetY =
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值