You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 03:52:18