当前位置: 首页 > news >正文

C# Wpf 图片按照鼠标中心缩放和平移

C# Wpf 图片按照鼠标中心缩放和平移

1、缩放事件

MouseWheel(object sender, MouseWheelEventArgs e)

2、平移相关的事件

MouseMove(object sender, MouseEventArgs e)
MouseDown(object sender, MouseButtonEventArgs e)
MouseUp(object sender, MouseButtonEventArgs e)

3、图片平移实现

public Point StartPoint;
public Point Origin;private void ImageEx_MouseUp(object sender, MouseButtonEventArgs e){this.ReleaseMouseCapture();}private void ImageEx_MouseMove(object sender, MouseEventArgs e){if (e.LeftButton == MouseButtonState.Released) return;TranslateTransform transform = group.Children[1] as TranslateTransform;var startPoint = StartPoint - e.GetPosition(this);transform.X = Origin.X - startPoint.X;transform.Y = Origin.Y - startPoint.Y;}private void ImageEx_MouseDown(object sender, MouseButtonEventArgs e){StartPoint = e.GetPosition(this);TranslateTransform trans = group.Children[1] as TranslateTransform;Origin = new Point(trans.X, trans.Y);this.CaptureMouse();}

4、图片缩放实现

private void ImageEx_MouseWheel(object sender, MouseWheelEventArgs e)
{Point relative = e.GetPosition(image);double zoom = e.Delta > 0 ? 0.1 : -0.1;ScaleTransform scale = group.Children[0] as ScaleTransform;TranslateTransform trans = group.Children[1] as TranslateTransform;double absoluteX;double absoluteY;absoluteX = relative.X * scale.ScaleX + trans.X;absoluteY = relative.Y * scale.ScaleY + trans.Y;scale.ScaleX += zoom;scale.ScaleY += zoom;trans.X = absoluteX - relative.X * scale.ScaleX;trans.Y = absoluteY - relative.Y * scale.ScaleY;
}

5、完整代码

1、xaml

<UserControl x:Class="WpfApp1.ImageEx"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:local="clr-namespace:WpfApp1"mc:Ignorable="d" xmlns:panAndZoom="clr-namespace:Wpf.Controls.PanAndZoom;assembly=Wpf.Controls.PanAndZoom"d:DesignHeight="450" d:DesignWidth="800"><Grid DataContext="{Binding RelativeSource={RelativeSource AncestorType=UserControl}}"><Image Visibility="Collapsed" Source="{Binding CurrentImage}" x:Name="image"><Image.RenderTransform><TransformGroup x:Name="group"><ScaleTransform /><TranslateTransform /></TransformGroup></Image.RenderTransform></Image></Grid></UserControl>

2、CS

namespace WpfApp1
{/// <summary>/// ImageEx.xaml 的交互逻辑/// </summary>public partial class ImageEx : UserControl{public Point StartPoint;public Point Origin;public BitmapSource CurrentImage { get; set; }public ImageEx(){InitializeComponent();CurrentImage = new BitmapImage(new Uri("C:\\Users\\Desktop\\111.png"));this.MouseDown += ImageEx_MouseDown;this.MouseMove += ImageEx_MouseMove;this.MouseUp += ImageEx_MouseUp;this.MouseWheel += ImageEx_MouseWheel;}private void ImageEx_MouseUp(object sender, MouseButtonEventArgs e){this.ReleaseMouseCapture();}private void ImageEx_MouseWheel(object sender, MouseWheelEventArgs e){Point relative = e.GetPosition(image);double zoom = e.Delta > 0 ? 0.1 : -0.1;ScaleTransform scale = group.Children[0] as ScaleTransform;TranslateTransform trans = group.Children[1] as TranslateTransform;double absoluteX;double absoluteY;absoluteX = relative.X * scale.ScaleX + trans.X;absoluteY = relative.Y * scale.ScaleY + trans.Y;scale.ScaleX += zoom;scale.ScaleY += zoom;trans.X = absoluteX - relative.X * scale.ScaleX;trans.Y = absoluteY - relative.Y * scale.ScaleY;}private void ImageEx_MouseMove(object sender, MouseEventArgs e){if (e.LeftButton == MouseButtonState.Released) return;TranslateTransform transform = group.Children[1] as TranslateTransform;var startPoint = StartPoint - e.GetPosition(this);transform.X = Origin.X - startPoint.X;transform.Y = Origin.Y - startPoint.Y;}private void ImageEx_MouseDown(object sender, MouseButtonEventArgs e){StartPoint = e.GetPosition(this);TranslateTransform trans = group.Children[1] as TranslateTransform;Origin = new Point(trans.X, trans.Y);this.CaptureMouse();}}}

3、调用方法

<Window x:Class="WpfApp1.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:WpfApp1"mc:Ignorable="d"Title="MainWindow" Height="450" Width="800"><Grid><local:ImageEx  x:Name="imageEx" /></Grid>
</Window>

http://www.mrgr.cn/news/45901.html

相关文章:

  • 微服务架构---认识Zuul
  • AI学习指南深度学习篇-生成对抗网络在深度学习中的应用
  • 【PostgreSQL】运维篇——PostgreSQL 的容量规划与监控
  • 开放式耳机哪个牌子好?开放式耳机怎么选?蓝牙耳机推荐2024
  • 【习题】应用DFX能力介绍
  • 肺结节分割与提取系统(基于传统图像处理方法)
  • PyQt入门指南十 数据库操作入门
  • HTML DOM 节点
  • Java设计模式——适配器模式
  • 逼近理论及应用精解【12】
  • 初学者如何快速入门人工智能
  • Ruby XML, XSLT 和 XPath 教程
  • 自动驾驶系列—从IMU到惯性定位算法:自动驾驶精准定位的幕后科技
  • Unity 3d 鼠标设置的问题——隐藏/显示鼠标、锁定/解锁/限制鼠标、自定义鼠标形状
  • docker compose入门6—如何挂载卷
  • jEasyUI 启用行内编辑
  • 收银台实现iframe跨页面调用函数的方法——未来之窗行业应用跨平台架构
  • 手机竖屏 Premiere Pro 电影转场特效视频模板Pr工程文件
  • 分布式事务讲解 - 2PC、3PC、TCC
  • 【网络】深入探索OSI七层模型:构建网络通信的基石