.net maui добавляет объекты на холст во время выполнения

Допустим, у меня очень просто xaml

<?xml version = "1.0" encoding = "utf-8" ?>
<ContentPage xmlns = "http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x = "http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:drawable = "clr-namespace:eden.Pages"
             x:Class = "eden.Pages.Modeler">
    <ContentPage.Resources>
    <drawable:GraphicsDrawable x:Key = "drawable" />
</ContentPage.Resources>
    <VerticalStackLayout>
        <GraphicsView x:Name = "modelerArea"
            Drawable = "{StaticResource drawable}">
            <FlyoutBase.ContextFlyout>
                <MenuFlyout>
                    <MenuFlyoutItem Text = "Add rectangle"
                            Clicked = "AddRectangle"> <!-- HERE I WANT TO ADD RECTANGLE ON CLICK -->
                    </MenuFlyoutItem>
                </MenuFlyout>
            </FlyoutBase.ContextFlyout>
        </GraphicsView>
    </VerticalStackLayout>
</ContentPage>

А дальше очень просто xaml.cs

public partial class Modeler : ContentPage
    {
        public Modeler()
        {
            InitializeComponent();
        }

        private void AddRectangle(object sender, EventArgs e)
        {
           // for example
           // var mySpecialRectangle = new specialRectangle();
           // canvas.Add(mySpecialRectangle);
        }
    }

    public class GraphicsDrawable : IDrawable
    {
        public void Draw(ICanvas canvas, RectF dirtyRect)
        {
            canvas.StrokeColor = Colors.Red;
            canvas.StrokeSize = 6;
            canvas.DrawLine(10, 10, 90, 100);
        }
    }
}

Как я могу добавить этот объект в холст/графическое представление?

Руководство для начинающих по веб-разработке на React.js
Руководство для начинающих по веб-разработке на React.js
Веб-разработка - это захватывающая и постоянно меняющаяся область, которая постоянно развивается благодаря новым технологиям и тенденциям. Одним из...
Разница между Angular и React
Разница между Angular и React
React и AngularJS - это два самых популярных фреймворка для веб-разработки. Оба фреймворка имеют свои уникальные особенности и преимущества, которые...
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Веб-скрейпинг, как мы все знаем, это дисциплина, которая развивается с течением времени. Появляются все более сложные средства борьбы с ботами, а...
Калькулятор CGPA 12 для семестра
Калькулятор CGPA 12 для семестра
Чтобы запустить этот код и рассчитать CGPA, необходимо сохранить код как HTML-файл, а затем открыть его в веб-браузере. Для этого выполните следующие...
ONLBest Online HTML CSS JAVASCRIPT Training In INDIA 2023
ONLBest Online HTML CSS JAVASCRIPT Training In INDIA 2023
О тренинге HTML JavaScript :HTML (язык гипертекстовой разметки) и CSS (каскадные таблицы стилей) - две основные технологии для создания веб-страниц....
Как собрать/развернуть часть вашего приложения Angular
Как собрать/развернуть часть вашего приложения Angular
Вам когда-нибудь требовалось собрать/развернуть только часть вашего приложения Angular или, возможно, скрыть некоторые маршруты в определенных средах?
0
0
187
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы читали Рисовать графические объекты?

Вы не «добавляете объекты» в подходе ICanvas. Скорее, вы делаете вызовы «отрисовки».

ModelerArea — это canvas в вашем xaml, поэтому это будут вариации на тему:

public void MyDrawLine(ICanvas canvas, ...)
{
    canvas.DrawLine(...);
}

...
MyDrawLine(modelerArea, ...);

Предостережение: я никогда не делал этого сам; Я основываюсь на связанном документе.

Подразумевается, что если вы хотите «запомнить» некоторые «объекты» на потом, вам придется сделать это самостоятельно. Определите свой собственный класс, описывающий объект для рисования. Ведите список этих «моделей» объектов, чтобы вы могли нарисовать их все позже.

Ответ принят как подходящий

Прямоугольник рисуется в графическом представлении. Таким образом, вы можете создать класс, унаследованный от IDrawable, а затем установить его как свойство Drawable экземпляра GraphicsView. Наконец, вы можете добавить экземпляр GraphicsView в макет. Такие как:

В файле page.xaml:

<VerticalStackLayout
            Spacing = "25"
            Padding = "30,0"
            VerticalOptions = "Center"
        x:Name = "layout">
        <Button
                x:Name = "CounterBtn"
                Text = "Click me"
                Clicked = "OnCounterClicked" />
    </VerticalStackLayout>

На странице.cs:

public partial class MainPage : ContentPage
{

      public MainPage()
      {
            InitializeComponent();
      }
    internal class RectangleDrawable : IDrawable
    {
        public void Draw(ICanvas canvas, RectF dirtyRect)
        {
            canvas.StrokeColor = Colors.DarkBlue;
            canvas.StrokeSize = 4;
            canvas.DrawRectangle(10, 10, 100, 50);
        }
    }
    private void OnCounterClicked(object sender, EventArgs e)
      {
            
            GraphicsView graphicsView = new GraphicsView();
            graphicsView.Drawable = new RectangleDrawable();
        graphicsView.HeightRequest= 200;
        graphicsView.WidthRequest = 400;
        layout.Children.Add(graphicsView);
      }
}

Прямоугольник будет нарисован, когда вы нажмете кнопку.

Спасибо за ваш вклад. На самом деле, если я прав, это добавит еще один графический вид в макет? Я хочу добавить больше элементов в один графический вид.

Juraj Jakubov 27.11.2022 12:05

Но graphicsView.Drawable может просто установить один drawable. @JurajJakubov

Liyun Zhang - MSFT 28.11.2022 08:58

А ну понятно. И есть ли способ, как я могу добавить больше элементов на один холст, например, по щелчку. Например, я нажимаю, и он добавит новую строку или что-то еще, но на тот же холст.

Juraj Jakubov 28.11.2022 09:36

Кажется, такого API для graphicsView нет. Или можно попробовать использовать SKCanvas в мауи. Пакет SkiaSharp поддерживает maui.@JurajJakubov

Liyun Zhang - MSFT 28.11.2022 09:51

Другие вопросы по теме