DrawingView

Het DrawingView biedt een oppervlak waarmee u lijnen kunt tekenen door middel van aanraak- of muisinteractie. Het resultaat van een gebruikerstekening kan worden opgeslagen als afbeelding. Een veelvoorkomend gebruiksvoorbeeld hiervoor is het opgeven van een handtekeningvak in een toepassing.

Basaal gebruik

DrawingView hiermee kunt u lijnkleur, lijnbreedte en binding instellen op de verzameling lijnen.

XAML

Inclusief de XAML-naamruimte

Als u de toolkit in XAML wilt gebruiken, moet de volgende xmlns worden toegevoegd aan uw pagina of weergave:

xmlns:toolkit="http://schemas.microsoft.com/dotnet/2022/maui/toolkit"

Daarom volgt het volgende:

<ContentPage
    x:Class="CommunityToolkit.Maui.Sample.Pages.MyPage"
    xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml">

</ContentPage>

Zou als volgt worden gewijzigd om de xmlns op te nemen:

<ContentPage
    x:Class="CommunityToolkit.Maui.Sample.Pages.MyPage"
    xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
    xmlns:toolkit="http://schemas.microsoft.com/dotnet/2022/maui/toolkit">

</ContentPage>

De DrawingView gebruiken

<toolkit:DrawingView
            Lines="{Binding MyLines}"
            LineColor="Red"
            LineWidth="5" />

C#

using CommunityToolkit.Maui.Views;

var drawingView = new DrawingView
{
    Lines = new ObservableCollection<IDrawingLine>(),
    LineColor = Colors.Red,
    LineWidth = 5
};

In de volgende schermopname ziet u de resulterende DrawingView op Android:

Schermafbeelding van een DrawingView op Android

MultiLine-gebruik

Standaard ondersteunt DrawingView slechts 1 regel. Als u MultiLine wilt inschakelen, stelt u IsMultiLineModeEnabled in op true. Zorg ervoor dat ShouldClearOnFinish onwaar is.

XAML

<views:DrawingView
            Lines="{Binding MyLines}"
            IsMultiLineModeEnabled="true"
            ShouldClearOnFinish="false" />

C#

using CommunityToolkit.Maui.Views;

var gestureImage = new Image();
var drawingView = new DrawingView
{
    Lines = new ObservableCollection<IDrawingLine>(),
    IsMultiLineModeEnabled = true,
    ShouldClearOnFinish = false,
};

In de volgende schermopname ziet u de resulterende DrawingView op Android:

Schermopname van een DrawingView met meerdere regels op Android

Het resultaat opslaan in een afbeelding

De .NET MAUI Community Toolkit biedt verschillende opties voor het opslaan van de resulterende tekening naar een afbeelding. Deze opties zijn als volgt:

Opslaan vanuit de DrawingView

De DrawingView biedt de methode GetImageStream, waarmee een afbeelding wordt gegenereerd en de inhoud in een Stream wordt teruggegeven.

In het volgende voorbeeld wordt de tekening geƫxporteerd naar een afbeelding met een gewenste breedte van 400 en een gewenste hoogte van 300. De gewenste afmetingen worden aangepast om ervoor te zorgen dat de hoogte-breedteverhouding van de tekening behouden blijft.

await drawingView.GetImageStream(desiredWidth: 400, desiredHeight: 300);

Note

Standaard retourneert de GetImageStream methode een afbeelding die de getekende lijnen bevat. Dit komt niet overeen met het volledige oppervlak dat de gebruiker ziet. Als u een afbeelding wilt genereren die rechtstreeks overeenkomt met het oppervlak dat in de toepassing wordt weergegeven, moet de GetImageStream methode met de DrawingViewOutputOption parameter worden gebruikt.

In het volgende voorbeeld ziet u hoe u een afbeelding genereert die rechtstreeks overeenkomt met het Tekenweergave-oppervlak dat wordt weergegeven in een toepassing:

await drawingView.GetImageStream(desiredWidth: 400, desiredHeight: 300, imageOutputOption: DrawingViewOutputOption.FullCanvas);

Opslaan vanuit de DrawingViewService

Door de DrawingView methoden te gebruiken, kan het lastig zijn om een toepassing te bouwen met behulp van het MVVM-patroon, om hiermee om te gaan, biedt de .NET MAUI Community Toolkit ook de klasse DrawingViewService waarmee ook de mogelijkheid wordt geboden om een afbeeldingsstroom te genereren.

ImageLineOptions.JustLines

In het volgende voorbeeld ziet u hoe u een afbeeldingsstroom genereert van een gewenste breedte van 1920 en hoogte van 1080 en een blauwe achtergrond. Ontwikkelaars kunnen de ImageLineOptions.JustLines methode gebruiken om geschikte opties te bieden om alleen de getekende lijnen te exporteren. Zie als u het hele canvas wilt exporteren ImageLineOptions.FullCanvas

await using var stream = await DrawingViewService.GetImageStream(
    ImageLineOptions.JustLines(Lines, new Size(1920, 1080), Brush.Blue));

ImageLineOptions.FullCanvas

Als u een afbeelding wilt genereren die rechtstreeks overeenkomt met het DrawingView-oppervlak, kan de ImageLineOptions.FullCanvas methode als volgt worden gebruikt.

await using var stream = await DrawingViewService.GetImageStream(
    ImageLineOptions.FullCanvas(Lines, new Size(1920, 1080), Brush.Blue, new Size(CanvasWidth, CanvasHeight)));

Voor dit voorbeeld zijn de eigenschappen CanvasWidth en CanvasHeight respectievelijk gekoppeld aan de eigenschappen Width en Height van de DrawingView. Raadpleeg de .NET MAUI Community Toolkit Sample Application voor de volledige oplossing.

Gebeurtenis afhandelen wanneer het tekenen van een lijn is voltooid

DrawingView staat toe om u te abonneren op de gebeurtenissen zoals OnDrawingLineCompleted. De bijbehorende opdracht DrawingLineCompletedCommand is ook beschikbaar.

XAML

<views:DrawingView
            Lines="{Binding MyLines}"
            DrawingLineCompletedCommand="{Binding DrawingLineCompletedCommand}"
            OnDrawingLineCompleted="OnDrawingLineCompletedEvent" />

C#

using CommunityToolkit.Maui.Views;

var gestureImage = new Image();
var drawingView = new DrawingView
{
    Lines = new ObservableCollection<IDrawingLine>(),
    DrawingLineCompletedCommand = new Command<IDrawingLine>(async (line) =>
    {
        var cts = new CancellationTokenSource(TimeSpan.FromSeconds(5));

        var stream = await line.GetImageStream(gestureImage.Width, gestureImage.Height, Colors.Gray.AsPaint(), cts.Token);
        gestureImage.Source = ImageSource.FromStream(() => stream);
    })
};
drawingView.OnDrawingLineCompleted += async (s, e) =>
{
    var cts = new CancellationTokenSource(TimeSpan.FromSeconds(5));

    var stream = await e.LastDrawingLine.GetImageStream(gestureImage.Width, gestureImage.Height, Colors.Gray.AsPaint(), cts.Token);
    gestureImage.Source = ImageSource.FromStream(() => stream);
};

Gebruiken in een ScrollView

Bij gebruik van de DrawingView in een ScrollView kan de aanraakinteractie met de ScrollView op iOS soms worden onderschept. Dit kan worden voorkomen door de ShouldDelayContentTouches eigenschap false in te stellen op iOS volgens het volgende voorbeeld:

Ik heb dit probleem opgelost door de ios:ScrollView.ShouldDelayContentTouches="false" toe te voegen aan de ScrollView die de DrawingView bevat:

<ContentPage
    xmlns:ios="clr-namespace:Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific;assembly=Microsoft.Maui.Controls">

    <ScrollView ios:ScrollView.ShouldDelayContentTouches="false">

        <DrawingView />

    </ScrollView>

</ContentPage>

Raadpleeg ScrollView content touches voor meer informatie.

Geavanceerd gebruik

Om optimaal te profiteren, biedt de DrawingView methoden om de beeldstream van de getekende lijnen te verkrijgen.

XAML

<toolkit:DrawingView
            x:Name="DrawingViewControl"
            Lines="{Binding MyLines}"
            IsMultiLineModeEnabled="true"
            ShouldClearOnFinish="true"
            DrawingLineCompletedCommand="{Binding DrawingLineCompletedCommand}"
            OnDrawingLineCompleted="OnDrawingLineCompletedEvent"
            LineColor="Red"
            LineWidth="5"
            HorizontalOptions="Fill"
            VerticalOptions="Fill">
            <toolkit:DrawingView.Background>
                    <LinearGradientBrush StartPoint="0,0"
                                         EndPoint="0,1">
                        <GradientStop Color="Blue"
                                      Offset="0"/>
                        <GradientStop Color="Yellow"
                                      Offset="1"/>
                    </LinearGradientBrush>
            </toolkit:DrawingView.Background>
</toolkit:DrawingView>

C#

using CommunityToolkit.Maui.Views;

var gestureImage = new Image();
var drawingView = new DrawingView
{
    Lines = new ObservableCollection<IDrawingLine>(),
    IsMultiLineModeEnabled = true,
    ShouldClearOnFinish = false,
    DrawingLineCompletedCommand = new Command<IDrawingLine>(async (line) =>
    {
        var cts = new CancellationTokenSource(TimeSpan.FromSeconds(5));

        var stream = await line.GetImageStream(gestureImage.Width, gestureImage.Height, Colors.Gray.AsPaint(), cts.Token);
        gestureImage.Source = ImageSource.FromStream(() => stream);
    }),
    LineColor = Colors.Red,
    LineWidth = 5,
    Background = Brush.Red
};
drawingView.OnDrawingLineCompleted += async (s, e) =>
{
    var cts = new CancellationTokenSource(TimeSpan.FromSeconds(5));

    var stream = await e.LastDrawingLine.GetImageStream(gestureImage.Width, gestureImage.Height, Colors.Gray.AsPaint(), cts.Token);
    gestureImage.Source = ImageSource.FromStream(() => stream);
};

// get stream from lines collection
var cts = new CancellationTokenSource(TimeSpan.FromSeconds(5));
var lines = new List<IDrawingLine>();
var stream1 = await DrawingView.GetImageStream(
                lines,
                new Size(gestureImage.Width, gestureImage.Height),
                Colors.Black.
                cts.Token);

// get steam from the current DrawingView
var stream2 = await drawingView.GetImageStream(gestureImage.Width, gestureImage.Height, cts.Token);

Eigenschappen

Property Type Description
Lijnen ObservableCollection<IDrawingLine> Verzameling van IDrawingLine die zich momenteel op de DrawingView
IsMultiLineModeEnabled bool Schakelt de modus met meerdere regels in. Als dit waar is, kunnen er meerdere lijnen op de DrawingView worden getekend, waarbij de tik/klik tussen de lijnen door wordt losgelaten. Opmerking: wanneer ClearOnFinish ook is ingeschakeld, worden de lijnen gewist nadat de tik/klik is losgelaten. Bovendien wordt na elke lijn die wordt getekend, DrawingLineCompletedCommand geactiveerd.
ShouldClearOnFinish bool Geeft aan of de DrawingView knop is gewist nadat u de tik/klik hebt losgelaten en een lijn is getekend. Opmerking: wanneer IsMultiLineModeEnabled dit ook is ingeschakeld, kan dit onverwacht gedrag veroorzaken.
DrawingLineStartedCommand ICommand Deze opdracht wordt aangeroepen wanneer het tekenen van een lijn op de DrawingView is begonnen.
DrawingLineCancelledCommand ICommand Dit commando wordt aangeroepen wanneer het tekenen van een lijn op de DrawingView is geannuleerd.
DrawingLineCompletedCommand ICommand Dit commando wordt aangeroepen wanneer het tekenen van een lijn op de DrawingView is voltooid. . Houd er rekening mee dat dit wordt geactiveerd nadat de tik of klik is opgeheven. Wanneer MultiLineMode is ingeschakeld, wordt deze opdracht meerdere keren uitgevoerd.
PointDrawnCommand ICommand Deze opdracht wordt aangeroepen wanneer de tekening van een punt op het DrawingView punt is voltooid.
OnDrawingLineStarted EventHandler<DrawingLineStartedEventArgs> DrawingView gebeurtenis treedt op wanneer de tekenlijn is gestart.
OnDrawingLineCancelled EventHandler<EventArgs> DrawingView Deze gebeurtenis treedt op wanneer het tekenen van een lijn wordt geannuleerd.
OnDrawingLineCompleted EventHandler<DrawingLineCompletedEventArgs> DrawingView gebeurtenis treedt op wanneer de tekenlijn is voltooid.
OnPointDrawn EventHandler<PointDrawnEventArgs> DrawingView gebeurtenis treedt op wanneer het punt is getekend.
Lijnkleur Color De kleur die standaard wordt gebruikt om een lijn te tekenen op de DrawingView.
Lijndikte float De breedte die standaard wordt gebruikt om een lijn op de DrawingView te tekenen.

Tekenlijn

De DrawingLine lijst bevat de lijst met punten en maakt het mogelijk om elke lijnstijl afzonderlijk te configureren.

Eigenschappen

Property Type Description Standaardwaarde
Lijnkleur Color De kleur die wordt gebruikt om de lijn op de DrawingView te tekenen. Colors.Black
Lijnbreedte float De breedte die wordt gebruikt om de lijn op de DrawingView te tekenen. 5
Punten ObservableCollection<PointF> De verzameling van PointF die de lijn vormt. new()
Granulariteit int De granulariteit van deze lijn. De minimumwaarde is 5. Hoe hoger de waarde, hoe soepeler de lijn, hoe langzamer het programma. 5
MoetPadGladstrijkenBijTekenen bool Hiermee schakelt u in of uit of deze lijn vloeiend wordt weergegeven (met anti-aliasing) wanneer deze wordt getekend. false

Aangepaste IDrawingLine

Er zijn twee stappen om de standaardwaarde DrawingLine te vervangen door de aangepaste implementatie:

  1. Aangepaste klasse maken die implementeert IDrawingLine:
    public class MyDrawingLine : IDrawingLine
    {
        public ObservableCollection<PointF> Points { get; } = new();
        ...
    }
    
  2. Maak een aangepaste klasse die IDrawingLineAdapter implementeert.
    public class MyDrawingLineAdapter : IDrawingLineAdapter
    {
        public IDrawingLine(MauiDrawingLine mauiDrawingLine)
        {
            return new MyDrawingLine
            {
                Points = mauiDrawingLine.Points,
                ...
            }
        }
    }
    
  3. Stel IDrawingLineAdapter aangepast in IDrawingViewHandler:
    var myDrawingLineAdapter = new MyDrawingLineAdapter();
    drawingViewHandler.SetDrawingLineAdapter(myDrawingLineAdapter);
    

DrawingLineStartedEventArgs

Gebeurtenisargument dat het laatste tekenpunt bevat.

Eigenschappen

Property Type Description
Point PointF Laatste tekenpunt.

DrawingLineCompletedEventArgs

Gebeurtenisargument dat de laatste tekenlijn bevat.

Eigenschappen

Property Type Description
LastDrawingLine IDrawingLine Laatste tekenlijn.

PointDrawnEventArgs

Eventargument dat het laatst getekende punt bevat.

Eigenschappen

Property Type Description
Point PointF Laatste tekenpunt.

Methods

Methode Description
GetImageStream Hiermee wordt een Stream opgehaald met een afbeelding van de Lines die momenteel op de DrawingView zijn getekend.
GetImageStream (statisch) Hiermee wordt een Stream opgehaald met een afbeelding van de verzameling IDrawingLine die als parameter is opgegeven.

Examples

Je kunt een voorbeeld van hoe deze functie werkt vinden in de .NET MAUI Community Toolkit Sample Application.

API

U vindt de broncode voor DrawingView in de .NET MAUI Community Toolkit GitHub opslagplaats.