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

如何将变量数据传入.NET MAUI GraphicsView画布?

解决方案

1. 修改GraphicsDrawable类,添加数据接收属性

给GraphicsDrawable类添加公共集合属性用于存储线条数据,在Draw方法中遍历集合绘制所有线条:

internal class GraphicsDrawable : IDrawable
{
    // 存储线条数据,每个元素包含线条的起点和终点Vector2
    public List<(Vector2 Start, Vector2 End)> Lines { get; set; } = new();

    public void Draw(ICanvas canvas, RectF dirtyRect)
    {
        canvas.StrokeColor = Colors.Red;
        canvas.StrokeSize = 6;

        // 遍历线条数据并绘制
        foreach (var line in Lines)
        {
            canvas.DrawLine(line.Start.X, line.Start.Y, line.End.X, line.End.Y);
        }
    }
}

2. 在MainPage中直接管理Drawable实例

放弃XAML静态资源声明的方式,在代码后台创建Drawable实例,直接控制数据传递和画布刷新:

MainPage.xaml修改:

<GraphicsView x:Name="MyGraphicsView"
              HeightRequest="300"
              WidthRequest="400" />

MainPage.xaml.cs修改:

public partial class MainPage : ContentPage
{
    private GraphicsDrawable _drawable;
    // 存储你的Vector2线条数据
    private Vector2[] _lineData = new[]
    {
        new Vector2(10, 10),
        new Vector2(90, 100),
        new Vector2(100, 50),
        new Vector2(200, 150)
    };

    public MainPage()
    {
        InitializeComponent();
        // 初始化Drawable并绑定到GraphicsView
        _drawable = new GraphicsDrawable();
        MyGraphicsView.Drawable = _drawable;
        
        // 加载初始数据
        UpdateCanvas();
    }

    // 更新Drawable数据并刷新画布
    private void UpdateCanvas()
    {
        _drawable.Lines.Clear();
        // 将数组转换为线条集合(每两个Vector2为一条线)
        for (int i = 0; i < _lineData.Length; i += 2)
        {
            if (i + 1 < _lineData.Length)
            {
                _drawable.Lines.Add((_lineData[i], _lineData[i + 1]));
            }
        }
        // 触发画布重新绘制
        MyGraphicsView.Invalidate();
    }

    // 示例:实时更新数据的触发方法(比如按钮点击)
    private void RefreshCanvas_Clicked(object sender, EventArgs e)
    {
        // 修改线条数据
        _lineData = new[]
        {
            new Vector2(50, 50),
            new Vector2(250, 200),
            new Vector2(150, 100),
            new Vector2(300, 50)
        };
        // 更新并刷新画布
        UpdateCanvas();
    }
}

3. 实现实时更新逻辑

每当需要更新画布时,修改_lineData数组后调用UpdateCanvas()方法即可——该方法会同步Drawable的数据,并调用Invalidate()强制GraphicsView重新绘制。

可选:MVVM场景适配

如果采用MVVM架构,可让GraphicsDrawable实现INotifyPropertyChanged接口,监听数据变化:

internal class GraphicsDrawable : IDrawable, INotifyPropertyChanged
{
    private List<(Vector2 Start, Vector2 End)> _lines = new();
    public List<(Vector2 Start, Vector2 End)> Lines
    {
        get => _lines;
        set
        {
            _lines = value;
            OnPropertyChanged();
        }
    }

    public void Draw(ICanvas canvas, RectF dirtyRect)
    {
        canvas.StrokeColor = Colors.Red;
        canvas.StrokeSize = 6;
        foreach (var line in Lines)
        {
            canvas.DrawLine(line.Start.X, line.Start.Y, line.End.X, line.End.Y);
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

在ViewModel中更新Lines集合后,调用GraphicsView的Invalidate()即可完成刷新。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 00:55:24