Допустим, у меня очень просто 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);
}
}
}
Как я могу добавить этот объект в холст/графическое представление?
Вы читали Рисовать графические объекты?
Вы не «добавляете объекты» в подходе 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);
}
}
Прямоугольник будет нарисован, когда вы нажмете кнопку.
Но graphicsView.Drawable может просто установить один drawable. @JurajJakubov
А ну понятно. И есть ли способ, как я могу добавить больше элементов на один холст, например, по щелчку. Например, я нажимаю, и он добавит новую строку или что-то еще, но на тот же холст.
Кажется, такого API для graphicsView нет. Или можно попробовать использовать SKCanvas в мауи. Пакет SkiaSharp поддерживает maui.@JurajJakubov
Спасибо за ваш вклад. На самом деле, если я прав, это добавит еще один графический вид в макет? Я хочу добавить больше элементов в один графический вид.