如果你使用WinForm比较难实现通过滚动鼠标滑轮来对图片进行缩放显示,那么,你应该考虑一下使用WPF,既然是下一代Windows客户端开发平台,明显是有一定优势的,不然,MS是吃饱了撑着。
 
首先,我们应该知道WPFUI元素都具备变换功能,不仅支持二维变换,同时也支持三维变换,但3D变换对CPU的处理能力有着一定要求,如果不使用3D,WPF对性能的要求其实并不高,说WPF吃内存更子扯谈,前面我的文章中已经详细讨论过,WPF与传统的面向对象编程模有些不同,WPF属性系统使用依赖项属性,所有属性都会在全局哈希表中进行注册,这也是为什么WPF程序启动速度较慢的原因,但它并不消耗内存,因为依赖项注项后并不随类的构造函一起初始,也就是说,用到的时候才分配内存,当然,这带来的问题显示是有些耗时间,所以说WPF是用时间来换取空间。
 
呵呵,扯远了,还是回到今天的主题,为什么说在WPF中实现滚动鼠标滑轮来缩放显示图象比较简单,除了路由事件的支持外,就是上文提到的变换。
 
变换包括旋转、倾斜、位移等,当然,比较灵活复杂的是矩阵变换。
我们今天的例子就是通过缩放变换来实现的,也就是ScaleTransform的使用。
 
首先建立一个WPF应用程序,并在在Grid中放一个Image元素,你就随便准备一个图片做测试就行了。
  1. <Grid x:Name="root">
  2. <Image x:Name="img" Margin="20,20,20,77" Source="60.jpg"
  3. MouseWheel="img_MouseWheel">
  4. <Image.RenderTransform>
  5. <ScaleTransform x:Name="sfr" />
  6. </Image.RenderTransform>
  7. </Image>
  8. </Grid>
上面的XAML都很简单,注意ScaleTransform 的使用,这里为了方便在代码中访问,所以我分配了一个名字给它。
 
接着,处理MouseWeel事件。
  1. private void img_MouseWheel(object sender, MouseWheelEventArgs e)
  2. {
  3. Point centerPoint = e.GetPosition(root);
  4. this.sfr.CenterX = centerPoint.X;
  5. this.sfr.CenterY = centerPoint.Y;
  6. if (sfr.ScaleX < 0.3 && sfr.ScaleY < 0.3 && e.Delta < 0)
  7. {
  8. return;
  9. }
  10. sfr.ScaleX += (double)e.Delta / 3500;
  11. sfr.ScaleY += (double)e.Delta / 3500;
  12. }
从事件参数e的GetPosition方法获得鼠标指针的相对坐标,参照系为根Grid元素,通过这个我们可以设置缩放的中心点的坐标。
接着设置ScaleX和ScaleY属性,即分别沿X轴和Y轴缩放的倍数,当然,倍数可以负值,表示缩小显示。
 
为什么这里我要把Delta值除以3500呢?因为鼠标滑轮每次滑动变化的范围值太大,我在本机上测得的值为120,很明显,我们不能一下子就赋120,这样Image会放大或缩小120倍以上,动作太大了。
所以要想办法让每次的变化量不能太大,注意Delta值要先转换为double类型再进行运算,不然,由于是整型,运算结果太小,化为整数会被舍入为0,就等于没有变化了,所以运算前要先做类型转换。
 
现在,你可以看看效果了。如果你有兴趣的话可以进一步完善,这里只做演示。
 

WPF通过鼠标滑轮缩放显示图片的更多相关文章

  1. Magnifier.js - 支持鼠标滚轮缩放的图片放大镜效果

    Magnifier.js 是一个 JavaScript 库,能够帮助你在图像上实现放大镜效果,支持使用鼠标滚轮放大/缩小功能.放大的图像可以显示在镜头本身或它的外部容器中.Magnifier.js 使 ...

  2. wpf image控件循环显示图片 以达到动画效果 问题及解决方案

    1>最初方案: 用wpf的image控件循环显示图片,达到动画效果,其实就是在后台代码动态改变Image.Source的值,关键代码: ; i < ; i++)//六百张图片 { Bitm ...

  3. WPF 标签预览可以显示图片运行后不显示

    使用<Image HorizontalAlignment="Left" Height="100" Margin="106,111,0,0&quo ...

  4. C# wpf image绑定viewModel没有显示图片

    在wpf绑定图片,用viewModel的图片绑定image 我是用viewModel.cs public class viewModel:INotifyPropertyChanged { #regio ...

  5. ASP.NET将原始图片按照指定尺寸等比例缩放显示图片

    网站上可能会有很多图片,比如产品图片等,而且他们可能大小不一,宽度和高度也不一定一样,有的很大有的很小.如果放在一张网页上,可能会破坏版面,但是如果强制让他们按照指定的宽度和高度显示,因为比例不同还会 ...

  6. 【python】显示图片 并随意缩放图片大小 图片归一化

    cv2.namedWindow("image_",0)  cv2.imshow("image_",image)就可以随意缩放显示图片的窗口大小啦. ------ ...

  7. 在WPF里面实现以鼠标位置为中心缩放移动图片

    原文:在WPF里面实现以鼠标位置为中心缩放移动图片 在以前的文章使用WPF Resource以及Transform等技术实现鼠标控制图片缩放和移动的效果里面,介绍了如何在WPF里面移动和放大缩小图片, ...

  8. VS+Qt+Halcon——显示图片,实现鼠标缩放、移动图片

    摘要 本篇博文记录一下,用VS+Qt+Halcon实现对图片的读取以及鼠标缩放,移动(鼠标事件调用了halcon自带的算子)的过程.以及遇到的坑..... 先来看一下动态效果图: 主要控件: 添加一个 ...

  9. WPF 获取元素(Visual)相对于屏幕设备的缩放比例,可用于清晰显示图片

    原文:WPF 获取元素(Visual)相对于屏幕设备的缩放比例,可用于清晰显示图片 我们知道,在 WPF 中的坐标单位不是屏幕像素单位,所以如果需要知道某个控件的像素尺寸,以便做一些与屏幕像素尺寸相关 ...

随机推荐

  1. UVA 10069 Distinct Subsequences(DP)

    考虑两个字符串,我们用dp[i][j]表示字串第到i个和字符串到第j个的总数,由于字串必须连续 因此dp[i][j]能够有dp[i][j-1]和dp[i-1][j-1]递推而来,而不能由dp[i-1] ...

  2. jquery ui progressbar简单使用deom

    jquery api 和下载: http://api.jqueryui.com/progressbar/#option-value <!doctype html> <html lan ...

  3. 使用同步适配器(sync adapter)数据传输

    在android设备与webserver之间实现数据同步能显著提高你的应用的有用性.让你的应用更受用户的欢迎. 比方说.你的数据上传给webserver,这就有了一个有用的备份.当用户的设备离线工作时 ...

  4. luogu1052 过河

    题目大意 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上.由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青蛙可能到达的点看成数 ...

  5. oc64--协议2@protocol

    // // SportProtocol.h // day17 // #import <Foundation/Foundation.h> @protocol SportProtocol &l ...

  6. Android中Calendar类的用法总结

    Calendar是Android开发中需要获取时间时必不可少的一个工具类,通过这个类可以获得的时间信息还是很丰富的,下面做一个总结,以后使用的时候就不用总是去翻书或者查资料了. 在获取时间之前要先获得 ...

  7. bzoj 1045 [HAOI2008] 糖果传递 —— 贪心

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1045 好像是贪心...但这是一个环... 看博客:http://hzwer.com/2656 ...

  8. openstack 性能优化极致

  9. js基本功能大全

    1.javascript的数组API: //定义数组 var pageIds = new Array(); pageIds.push('A'); 数组长度 pageIds.length; //shif ...

  10. Azure Command Line(Azure CLI)指南

    1.安装. MSI安装程序:https://aka.ms/installazurecliwindows https://docs.microsoft.com/zh-cn/cli/azure/insta ...