如何使用GetLastMousePositionScaled实现形状跟随光标?画布内容被擦除
形状跟随光标实现与画布内容被擦除的解决方法
当然可以用GetLastMousePositionScaled(out Point)实现形状跟随光标,你的核心思路是对的。
问题根源:默认调用Canvas.Render()时,画布会自动清空原有内容,只渲染当前调用AddRectangle添加的新图形,所以之前的内容会被擦除。
解决方法:
维护图形历史集合
定义一个类级别的集合保存所有需要保留的图形,每次添加新矩形后,先清空画布(如果需要),再重新添加所有历史图形,最后执行Render:// 类内声明集合存储所有矩形参数 private List<(float X, float Y, Color Color)> _rectHistory = new List<(float, float, Color)>(); // 更新逻辑 Canvas.GetLastMousePositionScaled(out Point mousePosition); // 记录新矩形的参数 _rectHistory.Add((mousePosition.X, mousePosition.Y, Color.Blue)); // 清空画布(确保无残留) Canvas.Clear(); // 重新添加所有历史矩形 foreach (var rect in _rectHistory) { Canvas.AddRectangle(rect.X, rect.Y, rect.Color); } Canvas.Render();注:如果是实时跟随场景,建议限制集合长度(比如只保留最近100个矩形),避免性能损耗。
关闭Render的自动清空(若API支持)
检查Canvas的Render方法是否提供重载参数控制是否清空画布,比如:Canvas.GetLastMousePositionScaled(out Point mousePosition); Canvas.AddRectangle(mousePosition.X, mousePosition.Y, Color.Blue); // 传入参数禁用自动清空 Canvas.Render(clearCanvas: false);这种方式最简洁,不需要维护历史集合,新图形会直接叠加在原有内容上。
使用分层绘制(若API支持)
如果Canvas支持图层功能,可以将原有内容放在背景图层,跟随光标的矩形放在临时图层,Render时仅更新临时图层,不影响背景内容。
内容的提问来源于stack exchange,提问作者ABM
相关产品推荐
相关产品推荐

