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

.NET MAUI GraphicsView控件能否追加元素无需刷新?

.NET MAUI GraphicsView 元素追加绘制方案

不需要每次清空并重新绘制整个控件,完全可以直接追加单个元素,具体实现逻辑如下:

  1. 核心思路
    GraphicsView 依赖 IDrawable 接口的 Draw 方法完成渲染,每次调用 GraphicsView.Invalidate() 都会触发该方法执行。你只需要维护一个存储所有待绘制元素的集合,每次添加新元素后触发重绘,在 Draw 方法中遍历集合绘制所有元素即可,新元素会自动和已有元素一起渲染,达到追加效果。

  2. 避免不必要的清空重绘
    如果选择清空集合再重新添加所有元素后重绘,反而会增加性能开销,尤其是当元素数量较多时,这种方式完全没必要。

  3. 简单代码示例

    • 定义自定义元素类:
      public class DrawingElement
      {
          public float X { get; set; }
          public float Y { get; set; }
          public Color FillColor { get; set; }
      }
      
    • 页面后台维护元素集合并处理添加逻辑:
      private readonly List<DrawingElement> _elements = new();
      private readonly MyDrawable _drawable;
      
      public MainPage()
      {
          InitializeComponent();
          _drawable = new MyDrawable(_elements);
          MyGraphicsView.Drawable = _drawable;
      }
      
      // 用户输入时调用此方法添加元素
      private void AddElement(float x, float y, Color color)
      {
          _elements.Add(new DrawingElement { X = x, Y = y, FillColor = color });
          MyGraphicsView.Invalidate(); // 触发重绘
      }
      
    • 实现 IDrawable 接口:
      public class MyDrawable : IDrawable
      {
          private readonly List<DrawingElement> _elements;
      
          public MyDrawable(List<DrawingElement> elements)
          {
              _elements = elements;
          }
      
          public void Draw(ICanvas canvas, RectF dirtyRect)
          {
              foreach (var element in _elements)
              {
                  canvas.FillColor = element.FillColor;
                  canvas.FillCircle(element.X, element.Y, 15); // 示例绘制圆形元素
              }
          }
      }
      

内容的提问来源于stack exchange,提问作者MikeH

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 21:22:05