调整矩形大小时位置偏移问题排查
问题原因及修复方案
核心问题
偏移问题是因为切换调整角(如从RM转为LM)时,没有重新同步startPoint与当前鼠标位置的对应关系,导致后续的差值计算(diffX)基于旧的基准点,进而引发位置和尺寸的错误偏移。
代码中的具体问题
- 在
Corner.RM分支中,当newWidth < 0切换为Corner.LM时,startPoint仍保留之前的鼠标位置,未根据新的调整逻辑重置基准——RM是基于右边缘调整,切换为LM后需以左边缘为基准,但startPoint未同步更新。 - 同理,
Corner.LM分支切换为Corner.RM时,startPoint也未同步更新,导致后续计算基准错误。 RM分支直接用newPoint.X - left设置宽度,和diffX的计算逻辑脱节,切换角时更容易出现基准混乱。
修复方案
切换调整角时,重新计算并设置startPoint,让新的调整逻辑基于正确基准点,同时统一尺寸计算逻辑:
public void HandleMouseMove(object sender, MouseEventArgs e) { if (isResizing) { Point newPoint = Mouse.GetPosition(MainCanvas); double left = Canvas.GetLeft(editor.SelectedArea); double width = editor.SelectedArea.Width; double diffX = newPoint.X - startPoint.X; switch (currentCorner) { case Corner.RM: double newWidth = width + diffX; if (newWidth < 0) { // 切换为LM时,重置startPoint为矩形左边缘的对应基准点 currentCorner = Corner.LM; startPoint = new Point(left, startPoint.Y); } else { editor.SelectedArea.Width = newWidth; } break; case Corner.LM: double newWidthLm = width - diffX; if (newWidthLm < 0) { // 切换为RM时,重置startPoint为矩形右边缘的对应基准点 currentCorner = Corner.RM; startPoint = new Point(left + width, startPoint.Y); } else { Canvas.SetLeft(editor.SelectedArea, left + diffX); editor.SelectedArea.Width = newWidthLm; } break; } startPoint = newPoint; } }
修复说明
- 切换调整角时,根据新逻辑重置
startPoint:比如从RM切到LM时,将startPoint设为当前矩形左边缘的X坐标,确保后续diffX计算基于左边缘的偏移。 - 统一用
diffX计算新尺寸和位置,避免与基准点无关的直接计算,保证逻辑一致性。
内容的提问来源于stack exchange,提问作者White Mage
相关产品推荐
相关产品推荐

