WPF提供了很多函数方便我们处理图片,例如各式各样的Transform类用来移动、缩放和旋转图片,有各式各样的Effect类来修改图片的外观。更难得的是,这些类都可以在XAML代码直接设置,而XAML为了提高代码的可维护性,又为我们提供了Resource这么好的概念来将通用的代码和设置保存在一个中心位置,其它控件可以直接引用同一个Resource就可以获取同样的设置。因此,为什么我们不能将这两个工具结合起来编写尽量少的代码来实现图片移动和缩放的功能呢?

步骤如下:

1.         定义一个TranslateTransform实例来修改图片显示的起始位置。

2.         定义一个ScaleTransform实例来缩放图片的大小,你可以通过设置CenterX和CenterY的值来指定图片缩放的原点。

3.         将两个Transform放到一个TransformGroup里面,这样Image控件就可以在显示的时候综合使用两个Transform的效果了。

4.         将TransformGroup放到当前窗体的Resource里面,这样窗体里面所有的Image控件都可以引用到这个实例。

5.         在鼠标移动事件里面修改TranslateTransform对应的值。

6.         在鼠标滚轮事件里面修改ScaleTransform的ScaleX和ScaleY的值来缩放图片。

<Window x:Class="图片的缩放.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:local="clr-namespace:图片的缩放"mc:Ignorable="d"Title="MainWindow" Height="450" Width="800"><Grid x:Name="MainPanel"><Grid.Resources><TransformGroup x:Key="ImageTransformResource"><ScaleTransform /><TranslateTransform /></TransformGroup></Grid.Resources><Grid.ColumnDefinitions><ColumnDefinition /><ColumnDefinition /></Grid.ColumnDefinitions><Rectangle Grid.Column="0" x:Name="MasterImage"MouseLeftButtonDown="MasterImage_MouseLeftButtonDown"MouseLeftButtonUp="MasterImage_MouseLeftButtonUp"MouseMove="MasterImage_MouseMove"MouseWheel="MasterImage_MouseWheel"><Rectangle.Fill><VisualBrush Transform="{StaticResource ImageTransformResource}" Stretch="Uniform"><VisualBrush.Visual><Image Source="shipin.png" /></VisualBrush.Visual></VisualBrush></Rectangle.Fill></Rectangle><Rectangle Grid.Column="1"MouseLeftButtonDown="MasterImage_MouseLeftButtonDown"MouseLeftButtonUp="MasterImage_MouseLeftButtonUp"MouseMove="MasterImage_MouseMove"MouseWheel="MasterImage_MouseWheel"><Rectangle.Fill><VisualBrush Transform="{StaticResource ImageTransformResource}" Stretch="Uniform"><VisualBrush.Visual><Image Source="zhuanhuan.png" /></VisualBrush.Visual></VisualBrush></Rectangle.Fill></Rectangle></Grid>
</Window>
using System.Diagnostics;
using System.Windows;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Shapes;namespace 图片的缩放
{/// <summary>/// MainWindow.xaml 的交互逻辑/// </summary>public partial class MainWindow : Window{public MainWindow(){InitializeComponent();}private bool m_IsMouseLeftButtonDown;private void MasterImage_MouseLeftButtonUp(object sender, MouseButtonEventArgs e){Rectangle rectangle = sender as Rectangle;if (rectangle == null)return;rectangle.ReleaseMouseCapture();m_IsMouseLeftButtonDown = false;}/// <summary>/// 鼠标的位置/// </summary>private Point m_PreviousMousePoint;/// <summary>/// 鼠标左键按下/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void MasterImage_MouseLeftButtonDown(object sender, MouseButtonEventArgs e){Rectangle rectangle = sender as Rectangle;if (rectangle == null)return;rectangle.CaptureMouse();//捕获鼠标m_IsMouseLeftButtonDown = true;m_PreviousMousePoint = e.GetPosition(rectangle);}/// <summary>/// 鼠标移动/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void MasterImage_MouseMove(object sender, MouseEventArgs e){Rectangle rectangle = sender as Rectangle;if (rectangle == null)return;if (m_IsMouseLeftButtonDown)DoImageMove(rectangle, e);}/// <summary>/// 开始移动/// </summary>/// <param name="rectangle"></param>/// <param name="e"></param>private void DoImageMove(Rectangle rectangle, MouseEventArgs e){//Debug.Assert(e.LeftButton == MouseButtonState.Pressed);if (e.LeftButton != MouseButtonState.Pressed)return;TransformGroup group = MainPanel.FindResource("ImageTransformResource") as TransformGroup;Debug.Assert(group != null);TranslateTransform transform = group.Children[1] as TranslateTransform;Point position = e.GetPosition(rectangle);transform.X += position.X - m_PreviousMousePoint.X;transform.Y += position.Y - m_PreviousMousePoint.Y;m_PreviousMousePoint = position;}/// <summary>/// 滚轮事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void MasterImage_MouseWheel(object sender, MouseWheelEventArgs e){TransformGroup group = MainPanel.FindResource("ImageTransformResource") as TransformGroup;Debug.Assert(group != null);ScaleTransform transform = group.Children[0] as ScaleTransform;transform.ScaleX += e.Delta * 0.001;transform.ScaleY += e.Delta * 0.001;//0.001是我随便取的一个值,因为滚轮的Delta值太大了}}
}

wpf拖拽图片,滚轮放大缩小相关推荐

  1. 前端图片拖拽,滚轮放大缩小

    拖拽 var offX = 0,offY = 0; onMouseDown(ev) {var svgId = document.getElementById("svgId");sv ...

  2. C#制作一个图片查看器,具有滚轮放大缩小,鼠标拖动,图像像素化,显示颜色RGB信息功能

    目录 前言 一.界面设计 二.关键技术 1.把图片拖入到窗体并显示 2.实现图像缩放的功能 3.实现图像的移动效果 4.实时显示当前鼠标处的RGB值 5. 右击功能的实现 6.效果展示 总结 前言 使 ...

  3. Jquery鼠标滚轮放大缩小图片

    使用Jquery鼠标点击图片,划动鼠标滚轮放大缩小图片. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN&q ...

  4. 鼠标滚轮放大/缩小图片

    <img id=pic src=" http://community.csdn.net/images/CSDN_logo.GIF" width=105 height=31 b ...

  5. 鼠标滚轮 放大缩小图片

    js实现鼠标滚轮放大缩小图片 <script>     //放大缩小图片     function   sdZoom(o)   {     var zoom=parseInt(o.styl ...

  6. js实现图片在div内滚轮放大缩小,有滚动条,双击回原状

    效果图: <style type="text/css"> *{padding:0;margin:0;} img{border:none;} #display{max-w ...

  7. Qt实现长图片的放大缩小以及动态显示

    这篇文章是在这个基础上进行讨论的谈一谈分别利用opencv.Qt.matlab动态显示图片的实现 其实就是想找一种更加合适的方法进行图片的放大缩小以及动态显示. 这个是效果图 我把项目命名为Qtmli ...

  8. element-ui+js+vue——实现图片的放大缩小拖动等功能——技能提升

    elementui+js+vue--实现图片组件的封装 1. 实现图片的放大缩小 2. 实现图片的拖动功能 3. 实现图片的预览 最近同事在写一个关于 图片放大缩小拖动的功能,其实不止是图片,只要是在 ...

  9. android 自由缩放图片大小,android Matrix实现图片随意放大缩小或拖动

    本文实例为大家分享了android Matrix图片随意放大缩小和拖动的具体代码,供大家参考,具体内容如下 step1:新建一个项目DragAndZoom,并准备一张照片放在res/drawable- ...

最新文章

  1. softmax(a,axis=0)的用法理解 总结
  2. SharePoint 2007 Web Content Management 性能优化系列 3 - IIS压缩
  3. 对于Chua 混沌电路进一步测试
  4. Linux平台下 vimrc配置(转网友:http://blog.csdn.net/wooin/article/details/1887737)
  5. 单表数据量过大处理策略
  6. 商业智能改变汽车行业
  7. 砸入近 30 亿美元后,马斯克拒绝加入 Twitter 董事会
  8. Yii 一些小的问题
  9. java中的linked_为Java实现LinkedArray
  10. qml修改图片的颜色
  11. 垃圾回收机制,垃圾回收的几种方法以及
  12. 黑马程序员——C语言基础 字符串
  13. button是块级元素吗_前端面试必知必会的十点,你都知道吗?
  14. vdbench多主机运行指导
  15. 工具栏的输入法栏完全消失
  16. 网站实现支付宝第三方登陆详解
  17. 阿里云注册域名,购买云服务器,备案,域名解析图文教程
  18. python透视表画图_如何用Python实现透视表?
  19. 统计英文中单词的个数
  20. 如何重新启动Windows的Explorer.exe(以及任务栏和“开始”菜单)

热门文章

  1. 智慧井盖解决方案-最新全套文件
  2. 陀螺仪推荐-Murata村田 6DoF惯性传感器SCHA634-D03
  3. 乐鑫ESP32模组如何查看内部flash芯片支持的工作模式(QIO、QOUT、DIO、DOUT)?
  4. linux centos用smartctl 打开硬盘写缓存
  5. 京东商品数据数据爬取
  6. 中国第二家傲途格精选酒店开业;德意志酒店集团所有旗舰酒店合入全新总品牌 | 美通企业日报...
  7. 最好的体育测试软件,体育锻炼标准测试app
  8. 如何扩展计算机c盘的控件,如何无损扩展C盘空间大小,这一招足够!
  9. Python数据分析案例-利用多元线性回归与随机森林回归算法预测笔记本新品价格
  10. Shader小技巧-翻转uv