【WPF】对Image元素进行缩放平移等操作
元素布局
<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 定义私有变量记录相关初始位置
/// <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 鼠标左键按下
- 通过
CaptureMouse将鼠标捕获到指定的元素image - 通过
GetPosition获取鼠标相对border位置 - 记录
image当前偏移位置
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 鼠标移动
- 通过
GetPosition获取当前鼠标相对border位置 - 计算鼠标相对初始位置移动的像素差值
- 将像素差值累计到初始偏移量上
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 鼠标左键抬起
- 通过
ReleaseMouseCapture释放鼠标捕获
private void image_MouseLeftButtonUp(object sender, MouseButtonEventArgs e){if (image.IsMouseCaptured){image.ReleaseMouseCapture();}}
2. 缩放
2.1 绑定 鼠标滚轮事件
public DialogImageWindow(){InitializeComponent();MouseWheel += MainWindow_MouseWheel;}
2.1
- 通过
GetPosition获取鼠标相对image的位置,该位置作为缩放中心点 - 根据
Delta参数来决定是在当前放大系数上放大(1.1倍)还是缩小(1.1倍).
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);elsem.ScaleAtPrepend(1 / 1.1, 1 / 1.1, p.X, p.Y);image.RenderTransform = new MatrixTransform(m);}
3. 还原
private void b1_Click(object sender, RoutedEventArgs e){image.RenderTransform = new ScaleTransform(1.0,1.0);image.RenderTransform = new TranslateTransform(0,0);}
相关文章:
【WPF】对Image元素进行缩放平移等操作
元素布局 <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"{Bin…...
JavaScript中Bom节点和表单的获取值
Bom节点 代表浏览器对象模型(Browser Object Model),它是浏览器提供的 JavaScript API,用于与浏览器窗口和浏览器本身进行交互 获取当前网页的URL: const currentURL window.location.href; console.log(currentURL…...
RDB.js:适用于 Node.js 和 Typescript 的终极对象关系映射器
RDB.js 是适用于 Node.js 和 Typescript 的终极对象关系映射器,可与 Postgres、MS SQL、MySQL、Sybase SAP 和 SQLite 等流行数据库无缝集成。无论您是使用 TypeScript 还是 JavaScript(包括 CommonJS 和 ECMAScript)构建应用程序,…...
ROI的投入产出比是什么?
ROI的投入产出比是什么? 投入产出比(Return on Investment, ROI)是一种评估投资效益的财务指标,用于衡量投资带来的回报与投入成本之间的关系。它的计算公式如下: 投资收益:指的是投资带来的净收入&#x…...
Linux打包发布常用命令
1、先下载一个FileZilla Client远程连接工具,并连接我们需要连接的服务器 2、进入xshell连接对应的服务器,连接后若不知道项目位置,可使用此命令查看 ps -ef | grep java 此时会出现一大串代码,找到以我这为例:root…...
Docker Swarm 节点维护
Docker Swarm Mode Docker Swarm 集群搭建 Docker Swarm 节点维护 Docker Service 创建 1.角色转换 Swarm 集群中节点的角色只有 manager 与 worker,所以其角色也只是在 manager 与worker 间的转换。即 worker 升级为 manager,或 manager 降级为 worke…...
AS/NZS 1859.3:2017 木基装饰板检测
木基装饰板是指以木质材料为基材,比如刨花板,胶合板等木质人造板,表面贴有PVC膜,三聚氰胺纸,木饰面等装饰层压制而成的木质复合材料,主要用于墙面装饰,家具等领域。 AS/NZS 1859.3:…...
深入理解算法:从基础到实践
深入理解算法:从基础到实践 1. 算法的定义2. 算法的特性3. 算法的分类按解决问题的性质分类:按算法的设计思路分类: 4. 算法分析5. 算法示例a. 搜索算法示例:二分搜索b. 排序算法示例:快速排序c. 动态规划示例…...
华为OD 机智的外卖员(100分)【java】A卷+B卷
华为OD统一考试A卷+B卷 新题库说明 你收到的链接上面会标注A卷还是B卷。目前大部分收到的都是B卷。 B卷对应20022部分考题以及新出的题目,A卷对应的是新出的题目。 我将持续更新最新题目 获取更多免费题目可前往夸克网盘下载,请点击以下链接进入: 我用夸克网盘分享了「华为O…...
Node编写用户登录接口
目录 前言 服务器 编写登录接口API 使用sql语句查询数据库中是否有该用户 判断密码是否正确 生成JWT的Token字符串 配置解析token的中间件 配置捕获错误中间件 完整的登录接口代码 前言 本文介绍如何使用node编写登录接口以及解密生成token,如何编写注册接…...
vlookup函数踩坑(wps)
使用wps的朋友看过来 vlookup函数踩坑,vlookup(查找值,查找范围,返回值的索引,精确查找or模糊查找) 我们要查找的数据的那一列,必须是查找范围的第一列! 案例,看下面的…...
老卫带你学---leetcode刷题(8. 字符串转换整数 (atoi))
8. 字符串转换整数 (atoi) 问题: 请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C 中的 atoi 函数)。 函数 myAtoi(string s) 的算法如下: 读入字符串并丢弃无用的前导空…...
了解事件冒泡
事件冒泡是指在网页中,当某个元素触发了一个事件时,这个事件会逐级向上传播到它的父元素,直至达到文档树的根节点。这种传播方式被称为事件冒泡。 为什么会有事件冒泡? 事件冒泡是为了方便处理多个嵌套元素的事件而引入的机制。…...
线性代数1:线性方程和系统
Digital Collection (staedelmuseum.de) 图片来自施泰德博物馆 一、前言 通过这些文章,我希望巩固我对这些基本概念的理解,同时如果可能的话,通过我希望成为一种基于直觉的数学学习方法为其他人提供额外的清晰度。如果有任何错误或机会需要我…...
“第四十八天” 计算机组成原理
数据结构学完了,不过也就是匆匆过了一遍,后面肯定还是要重来的。现在开始学机组了。 计算机发展历程: 计算机硬件唯一能识别的数据是二进制的 0/1,而在计算机中用低/高电平表示 0 / 1,也就是通过电信号传递数据&#x…...
【算法|贪心算法系列No.4】leetcode55. 跳跃游戏 45. 跳跃游戏 II
个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【LeetCode】 🍔本专栏旨在提高自己算法能力的同时,记录一下自己的学习过程,希望…...
第九章 JDBC
文章目录 一. 单选题(共5题,50分)二. 判断题(共5题,50分) 一. 单选题(共5题,50分) (单选题) 下列选项,可用于存储结果集的对象是() A.…...
Kubernetes基础概念及架构和组件
目录 一、kubernetes简介 1、kubernetes的介绍与作用 2、为什么要用K8S? 二、kubernetes特性 1、自我修复 2、弹性伸缩 3、服务发现和负载均衡 4、自动发布(滚动发布/更新)和回滚 5、集中化配置管理和密钥管理 6、存储编排 7、任务批…...
04.Finetune vs. Prompt
目录 语言模型回顾大模型的两种路线专才通才二者的比较 专才养成记通才养成记Instruction LearningIn-context Learning 自动Prompt 部分截图来自原课程视频《2023李宏毅最新生成式AI教程》,B站自行搜索 语言模型回顾 GPT:文字接龙 How are __. Bert&a…...
UG NX二次开发(C#)-采用NXOpen完成对象的合并操作
文章目录 1、前言2、Ufun实现布尔和操作的函数2.1 函数说明2.2 源代码3、采用NXOpen实现布尔和操作的函数3.1 函数说明3.2 源代码4、测试结果4.1 采用UFun 与NXOpen的结果4.2采用UFun 与NXOpen的对比说明1、前言 在UG NX中开发过程中,创建特征对象的时候往往会用到布尔操作,…...
从崩溃地址到问题源码:手把手教你用map文件逆向分析嵌入式程序死机原因
从崩溃地址到问题源码:嵌入式程序死机逆向分析实战指南 1. 嵌入式崩溃分析的核心价值与挑战 当嵌入式设备在现场运行中出现死机时,传统的调试器往往无法直接连接使用。此时,map文件与崩溃地址分析成为工程师最后的救命稻草。这种离线分析方法…...
避雷笔灵花费24进行AIGC降重,只降重了百分之几
https://ibiling.cn/paper-pass 还有我知网查AIGC率的费用,避雷了...
免费商用!Source Han Serif CN开源宋体完全实战手册
免费商用!Source Han Serif CN开源宋体完全实战手册 【免费下载链接】source-han-serif-ttf Source Han Serif TTF 项目地址: https://gitcode.com/gh_mirrors/so/source-han-serif-ttf 还在为商业设计项目寻找一款既专业又免费的中文字体吗?&…...
收藏!小白也能学会:2026年最值钱的职场技能——AI智能体搭建与变现
文章介绍了AI智能体如何从概念走向实际应用,取代传统白领岗位。AI智能体区别于传统AI在于其主动工作的能力,能自主感知环境、制定计划、执行任务并持续学习。低代码/零代码平台的出现使得普通人也能搭建AI智能体,大幅降低了使用门槛和成本。文…...
OBS智能背景移除插件:3步实现专业级无绿幕抠图效果
OBS智能背景移除插件:3步实现专业级无绿幕抠图效果 【免费下载链接】obs-backgroundremoval An OBS plugin for removing background in portrait images (video), making it easy to replace the background when recording or streaming. 项目地址: https://git…...
WPF SaveFileDialog高级功能实战:从基础配置到自定义扩展
1. SaveFileDialog基础配置与核心功能 刚接触WPF开发时,我发现SaveFileDialog这个控件就像个智能文件保存助手。它不仅能帮用户选择保存位置,还能处理各种文件操作细节。先来看看最基础的用法,这里我结合自己踩过的坑给大家分享几个实用技巧。…...
3分钟快速上手:多平台资源下载神器res-downloader终极指南
3分钟快速上手:多平台资源下载神器res-downloader终极指南 【免费下载链接】res-downloader 视频号、小程序、抖音、快手、小红书、直播流、m3u8、酷狗、QQ音乐等常见网络资源下载! 项目地址: https://gitcode.com/GitHub_Trending/re/res-downloader 在当今…...
探索数据中的数学之美:PySR符号回归工具让复杂规律触手可及
探索数据中的数学之美:PySR符号回归工具让复杂规律触手可及 【免费下载链接】PySR High-Performance Symbolic Regression in Python and Julia 项目地址: https://gitcode.com/gh_mirrors/py/PySR 你是否曾面对海量数据却难以理解其中的内在规律?…...
终极SketchUp STL插件指南:3D打印爱好者的完美转换解决方案
终极SketchUp STL插件指南:3D打印爱好者的完美转换解决方案 【免费下载链接】sketchup-stl A SketchUp Ruby Extension that adds STL (STereoLithography) file format import and export. 项目地址: https://gitcode.com/gh_mirrors/sk/sketchup-stl 你是否…...
HunyuanVideo-Foley对比传统音效库:AI生成在成本与创意上的突破
HunyuanVideo-Foley对比传统音效库:AI生成在成本与创意上的突破 1. 音效制作的技术革命 影视制作中,音效设计一直是决定作品质感的关键环节。传统方式要么依赖昂贵的商业音效库,要么需要专业团队实地录制,成本高且周期长。Hunyu…...
