博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
wpf图片定点缩放
阅读量:5916 次
发布时间:2019-06-19

本文共 3023 字,大约阅读时间需要 10 分钟。

去年犯小人,万事不顺,4月刚换工作,开始新工作

遇到一个小问题,需要读取图片,然后对图片进行定点缩放,很简答的逻辑,很简单的代码,但是,这尼玛我被wpf给坑了,这一坑就是三天

好了,很简单的一个UI

为什么用Canvas,而不用Grid,这两个布局是一样的呢?

原因很简单,我们要用到Canvas.Set()这类函数进行移位
下面我们就图解一下定点缩放的所谓思路吧,小二,上图

这尼玛图片有点坑爹是吧.....

一个正方形,鼠标位置在15,5,以这个点进行缩放那缩放后的位置应该是12.5,7.5,图片有个属性是Scale,是缩放比例,1是正常,0.5是一半,依次类推

那就这好办了,根据当前坐标和图片坐标进行一个相减,然后除以比例系数Scale,进行移位就行了

public double ImagePointX        {            get { return (double)GetValue(ImagePointXProperty); }            set { SetValue(ImagePointXProperty, value); }        }        public static readonly DependencyProperty ImagePointXProperty =            DependencyProperty.Register("ImagePointX", typeof(double), typeof(MainWindow), new PropertyMetadata(0d, ImagePointXChangedCallBack));        ///         /// Image的y坐标        ///         public double ImagePointY        {            get { return (double)GetValue(ImagePointYProperty); }            set            {                SetValue(ImagePointYProperty, value);            }        }        public static readonly DependencyProperty ImagePointYProperty =            DependencyProperty.Register("ImagePointY", typeof(double), typeof(MainWindow), new PropertyMetadata(0d, ImagePointYChangedCallBack));

我们设置两个依赖属性,定义image的x,y,在

private void Window_MouseWheel(object sender, MouseWheelEventArgs e)

内写方法,进行相应的变换,在代码里都有,代码在最下面

很简单,点击鼠标移动,点击滑轮定点缩放\
作为一个有良知的愤青,我自己都会问自己,

这么简单的一个东西还值得你这熊孩子上传所谓的代码??

鄙人这里有两个问题

1 为什么用属性,而不用Canvas.GetLeft()或者Canvas.GetTop来获取图片的位置

这就是坑爹的地方!

double currentScal = Scale / 0.5;                Scale += 0.5;                var currentPoint = Mouse.GetPosition(this);                image.Width = ImageWidth * Scale;                image.Height = ImageHeight * Scale;                ImagePointX = ImagePointX - (currentPoint.X - ImagePointX) / currentScal;                ImagePointY = ImagePointY - (currentPoint.Y - ImagePointY) / currentScal;

看这里,看这里,看上面的代码,这里是简单的比例压缩,

ImagePointX是当前image的x坐标,如果用Canvas.GetLeft会怎么样?
var currentPoint = Mouse.GetPosition(this);                image.Width = ImageWidth * Scale;                image.Height = ImageHeight * Scale;                //ImagePointX = ImagePointX - (currentPoint.X - ImagePointX) / currentScal;                //ImagePointY = ImagePointY - (currentPoint.Y - ImagePointY) / currentScal;                var left = Canvas.GetLeft(image);                var top = Canvas.GetTop(image);                left = left - (currentPoint.X - left) / currentScal;                top = top - (currentPoint.Y - top) / currentScal;                Canvas.SetLeft(image, left);                Canvas.SetTop(image, top);

效果是一样的

Canvas是实时获取元素位置,在界面上,元素可能有自己模板,里面包含了多个元素,这时候获取的位置就不一定准确(由于是自己项目代码和界面不方便拿出来),这里只是做个介绍,我碰到的就是界面中获取元素位置的时候元素没有刷新,而只能用属性保存元素的上一个位置,当时我跟踪坐标,计算,计算了三天,获取的永远是没有更新的坐标,当鼠标移动后,Canvas才开始更新正确,宁死不知道什么原因,后来用属性的方式,解决了,回头继续研究它为什么没有刷新,原因就在于界面之间的路由和鼠标事件的顺序,与其每次去读取,不如用属性来设置,毕竟,我喜欢数字和程序,因为数字和程序不会骗人

2 为什么用依赖属性而不用属性

 一方面它是一个自动绑定两方面通知,另一方面,还有一个一个回调机制,方便处理,界面看起来更平滑,易于维护和观赏性

 

源代码:

(你妹,终于知道怎么设置连接了)

转载于:https://www.cnblogs.com/fish124423/p/3690022.html

你可能感兴趣的文章
除了门店越开越小,中国零售行业还有这几大发展趋势
查看>>
A16Z 750万美元投资分布式文件系统 Tachyon
查看>>
c++中指针常量,常指针,指向常量的常指针区分
查看>>
《跨境电商 —— 阿里巴巴速卖通实操全攻略》一一第1章 速卖通入门第一步——开通账户...
查看>>
攻击者利用 Shellshock 漏洞入侵邮件服务器
查看>>
《Abaqus GUI程序开发指南(Python语言)》——2.7 if条件语句
查看>>
《软件建模与设计: UML、用例、模式和软件体系结构》一一2.6 状态机图
查看>>
《Adobe Illustrator CC经典教程》—第2课2.1节简介
查看>>
《Android 游戏开发大全(第二版)》——导读
查看>>
随机数是骗人的,.Net、Java、C为我作证
查看>>
深层学习:心智如何超越经验2.2 认知结构:基本要素
查看>>
如何使用 Datadog 监控 NGINX(第三篇)
查看>>
《自己动手做交互系统》——2.3 制作过程
查看>>
《网站设计 开发 维护 推广 从入门到精通》—— 1.1 网页设计的相关术语
查看>>
《点睛:ActionScript3.0游戏互动编程》——1.3 HSB模式及其与RGB间的转换
查看>>
创建和发布 Android 开发库的终极指南
查看>>
《Android NFC开发实战详解》——6.2节Android NFC P2P开发基础
查看>>
《重构与模式(修订版)》—第1章1.2节模式万灵丹
查看>>
保存138亿年?!5维磁盘在南安普顿大学研制成功
查看>>
《21天学通Java(第7版)》—— 2.9 小测验
查看>>