【WPF】对Image元素进行缩放平移等操作

元素布局

xml 复制代码
        <Border Grid.Row="1" Name="border" ClipToBounds="True" Margin="10,10,10,10">
            <Image Name="image" Visibility="Visible" Margin="3,3,3,3" Grid.Column="1" Source="{Binding SourceImage}" HorizontalAlignment="Center" VerticalAlignment="Center">
            </Image>
        </Border>

1.平移

1.1 定义私有变量记录相关初始位置

cs 复制代码
        /// <summary>
        /// 图片的起始偏移位置
        /// </summary>
        private Point origin;  
        /// <summary>
        /// 鼠标相对Border的起始位置
        /// </summary>
        private Point start; 

1.2 绑定 鼠标左键按下鼠标左键抬起鼠标移动事件

复制代码
        public DialogImageWindow()
        {
            InitializeComponent();
            image.MouseLeftButtonDown += image_MouseLeftButtonDown;
            image.MouseLeftButtonUp += image_MouseLeftButtonUp;
            image.MouseMove += image_MouseMove;
        }

1.3 鼠标左键按下

  1. 通过CaptureMouse将鼠标捕获到指定的元素image
  2. 通过GetPosition获取鼠标相对border位置
  3. 记录image当前偏移位置
cs 复制代码
        private void image_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            if (image.IsMouseCaptured) return;
            image.CaptureMouse();

            start = e.GetPosition(border);
            origin.X = image.RenderTransform.Value.OffsetX;
            origin.Y = image.RenderTransform.Value.OffsetY;
        }

1.4 鼠标移动

  1. 通过GetPosition获取当前鼠标相对border位置
  2. 计算鼠标相对初始位置移动的像素差值
  3. 将像素差值累计到初始偏移量上
cs 复制代码
 private void image_MouseMove(object sender, MouseEventArgs e)
        {
            if (!image.IsMouseCaptured) return;
            Point p = e.MouseDevice.GetPosition(border);

            Matrix m = image.RenderTransform.Value;
            m.OffsetX = origin.X + (p.X - start.X);
            m.OffsetY = origin.Y + (p.Y - start.Y);

            image.RenderTransform = new MatrixTransform(m);
        }

1.5 鼠标左键抬起

  1. 通过ReleaseMouseCapture释放鼠标捕获
cs 复制代码
private void image_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
        {
            if (image.IsMouseCaptured)
            {
                image.ReleaseMouseCapture();
            }
        }

2. 缩放

2.1 绑定 鼠标滚轮事件

cs 复制代码
        public DialogImageWindow()
        {
            InitializeComponent();
            MouseWheel += MainWindow_MouseWheel;
        }

2.1

  1. 通过GetPosition获取鼠标相对image的位置,该位置作为缩放中心点
  2. 根据Delta参数来决定是在当前放大系数上放大(1.1倍)还是缩小(1.1倍).
cs 复制代码
 private void MainWindow_MouseWheel(object sender, MouseWheelEventArgs e)
        {
            Point p = e.MouseDevice.GetPosition(image);

            Matrix m = image.RenderTransform.Value;
            if (e.Delta > 0)
                m.ScaleAtPrepend(1.1, 1.1, p.X, p.Y);
            else
                m.ScaleAtPrepend(1 / 1.1, 1 / 1.1, p.X, p.Y);

            image.RenderTransform = new MatrixTransform(m);
        }

3. 还原

cs 复制代码
private void b1_Click(object sender, RoutedEventArgs e)
        {
            image.RenderTransform = new ScaleTransform(1.0,1.0);
            image.RenderTransform = new TranslateTransform(0,0);
        }
相关推荐
hh9509 小时前
gent Plan x DeepSeek Harness:多 Agent 协作场景下的中央编排实践
人工智能·wpf·adg·火山引擎·agent plan·adg成都社区
Vae_Mars13 小时前
WPF中的Lazy<T>使用方法
wpf
zQ.ii14 小时前
WPF 触发器学习笔记
笔记·学习·wpf
SamChan9020 小时前
用PostgreSQL+pgvector构建PDF翻译记忆库:向量相似度检索+增量更新实战
数据库·python·ai·postgresql·pdf·wpf
李高钢2 天前
开源控件库 HandyControl 介绍与简单实践:让 WPF 界面告别“上个世纪“
开源·wpf
旋生万物2 天前
【终极实战】用Python从零“生成“一个宇宙:螺旋干涉模型的代码实现
开发语言·前端·人工智能·react.js·php·wpf
Now喔3 天前
WPF画刷介绍
wpf
李高钢3 天前
WPF/WinForms 客户端通过 gRPC 与后端通信:从 Proto 契约到流式调用的完整指南
wpf·grpc·winforms
一见已难忘4 天前
基于 Harmony 6.0 应用的宠物寄养预约系统实现
wpf·宠物
fl1768314 天前
基于C#WPF实现的内存加速球清理类似360加速球内存清理
开发语言·c#·wpf