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

.NET MAUI运行时如何向GraphicsView的Canvas添加自定义图形?

实现右键菜单添加自定义矩形到MAUI GraphicsView

要实现点击右键菜单添加自定义矩形的功能,核心是让IDrawable实例能够存储多个图形元素,并在添加后触发GraphicsView重绘。以下是具体实现步骤:

1. 改造GraphicsDrawable类,支持多图形存储与绘制

先给GraphicsDrawable添加集合保存所有自定义矩形,同时修改Draw方法遍历绘制这些矩形。可以定义一个带样式的自定义矩形类,方便后续扩展属性:

// 自定义矩形类,包含位置、大小和样式属性
public class SpecialRectangle
{
    public RectF Bounds { get; set; }
    public Color StrokeColor { get; set; } = Colors.Blue;
    public float StrokeSize { get; set; } = 2;
    public Color FillColor { get; set; } = Colors.LightBlue.WithAlpha(0.5f);
}

public class GraphicsDrawable : IDrawable
{
    // 存储所有自定义矩形的集合
    public List<SpecialRectangle> Rectangles { get; } = new List<SpecialRectangle>();

    public void Draw(ICanvas canvas, RectF dirtyRect)
    {
        // 保留原有绘制内容(示例中的红线)
        canvas.StrokeColor = Colors.Red;
        canvas.StrokeSize = 6;
        canvas.DrawLine(10, 10, 90, 100);

        // 遍历绘制所有添加的矩形
        foreach (var rect in Rectangles)
        {
            canvas.StrokeColor = rect.StrokeColor;
            canvas.StrokeSize = rect.StrokeSize;
            canvas.FillColor = rect.FillColor;
            
            canvas.FillRectangle(rect.Bounds); // 填充矩形内部
            canvas.DrawRectangle(rect.Bounds); // 绘制矩形边框
        }
    }
}

2. 在页面代码中实现添加矩形与重绘逻辑

修改页面后台代码,获取GraphicsDrawable实例,在右键菜单点击时添加矩形,并触发GraphicsView重绘:

public partial class Modeler : ContentPage
{
    private GraphicsDrawable _drawable;

    public Modeler()
    {
        InitializeComponent();
        // 从页面资源中获取Drawable实例
        _drawable = (GraphicsDrawable)Resources["drawable"];
    }

    private void AddRectangle(object sender, EventArgs e)
    {
        // 创建一个自定义矩形(这里设置默认位置和大小,可按需调整)
        var newRect = new SpecialRectangle
        {
            Bounds = new RectF(100, 100, 150, 100) // X坐标、Y坐标、宽度、高度
        };

        // 将矩形添加到Drawable的集合中
        _drawable.Rectangles.Add(newRect);

        // 通知GraphicsView重新绘制内容
        modelerArea.Invalidate();
    }
}

3. 可选:让矩形出现在右键点击位置

如果希望矩形直接出现在右键点击的位置,可以通过MenuFlyout的Opening事件记录点击坐标:

修改XAML,添加Opening事件

<GraphicsView x:Name="modelerArea" Drawable="{StaticResource drawable}">
    <FlyoutBase.ContextFlyout>
        <MenuFlyout Opening="MenuFlyout_Opening">
            <MenuFlyoutItem Text="Add rectangle" Clicked="AddRectangle" />
        </MenuFlyout>
    </FlyoutBase.ContextFlyout>
</GraphicsView>

修改后台代码,记录并使用点击位置

private Point _lastClickPosition;

private void MenuFlyout_Opening(object sender, EventArgs e)
{
    // 记录右键点击的位置(相对于GraphicsView)
    if (sender is MenuFlyout flyout)
    {
        _lastClickPosition = flyout.Position;
    }
}

private void AddRectangle(object sender, EventArgs e)
{
    // 使用右键点击位置作为矩形左上角
    var newRect = new SpecialRectangle
    {
        Bounds = new RectF((float)_lastClickPosition.X, (float)_lastClickPosition.Y, 150, 100)
    };

    _drawable.Rectangles.Add(newRect);
    modelerArea.Invalidate();
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 06:15:33