Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
DrawingView ger en yta som gör det möjligt att rita linjer med hjälp av beröring eller musinteraktion. Resultatet av en användares ritning kan sparas som bild.
Ett vanligt användningsfall för detta är att ange en signaturruta i ett program.
Grundläggande användning
DrawingView tillåter att ange linjefärg, linjebredd och bindning till samlingen med linjer.
XAML
Inklusive XAML-namnområdet
För att kunna använda verktygslådan i XAML måste följande xmlns läggas till på sidan eller vyn:
xmlns:toolkit="http://schemas.microsoft.com/dotnet/2022/maui/toolkit"
Därför följande:
<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>
Skulle ändras för att inkludera xmlns på följande sätt:
<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>
Använda DrawingView
<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
};
Följande skärmbild visar den resulterande DrawingView på Android:
Användning av MultiLine
Som standard DrawingView stöder endast 1 rad. För att aktivera MultiLine, ställ in IsMultiLineModeEnabled på true. Se till att ShouldClearOnFinish är falskt.
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,
};
Följande skärmbild visar den resulterande DrawingView på Android:
Spara resultatet till en bild
Den .NET MAUI Community Toolkit erbjuder flera alternativ för att spara den resulterande ritningen till en bild. Dessa alternativ är följande:
Spara från DrawingView
Tillhandahåller DrawingView metoden GetImageStream som genererar en avbildning och returnerar innehållet i en Stream.
I följande exempel exporteras ritningen till en bild med önskad bredd på 400 och en önskad höjd på 300. De önskade dimensionerna justeras för att se till att proportionerna för ritningen behålls.
await drawingView.GetImageStream(desiredWidth: 400, desiredHeight: 300);
Note
Som standard GetImageStream returnerar metoden en bild som innehåller de ritade linjerna. Detta matchar inte hela ytan som användaren ser. För att generera en bild som direkt matchar den yta som visas i programmet GetImageStream måste metoden med parametern DrawingViewOutputOption användas.
I följande exempel visas hur du genererar en bild som direkt matchar DrawingView-ytan som visas i ett program:
await drawingView.GetImageStream(desiredWidth: 400, desiredHeight: 300, imageOutputOption: DrawingViewOutputOption.FullCanvas);
Spara från DrawingViewService
Med hjälp av metoderna DrawingView kan det göra det svårt att skapa ett program med MVVM-mönstret för att hantera detta .NET MAUI Community Toolkit tillhandahåller även klassen DrawingViewService som också gör det möjligt att generera en bildström.
ImageLineOptions.JustLines
I följande exempel visas hur du genererar en bildström med önskad bredd på 1920 och höjden 1080 och en blå bakgrund. Utvecklare kan använda ImageLineOptions.JustLines metoden för att tillhandahålla lämpliga alternativ för att endast exportera de ritade linjerna. Information om hur du exporterar hela arbetsytan finns i ImageLineOptions.FullCanvas
await using var stream = await DrawingViewService.GetImageStream(
ImageLineOptions.JustLines(Lines, new Size(1920, 1080), Brush.Blue));
ImageLineOptions.FullCanvas
För att generera en bild som direkt matchar DrawingView-ytan ImageLineOptions.FullCanvas kan metoden användas på följande sätt.
await using var stream = await DrawingViewService.GetImageStream(
ImageLineOptions.FullCanvas(Lines, new Size(1920, 1080), Brush.Blue, new Size(CanvasWidth, CanvasHeight)));
I det här exemplet har egenskaperna CanvasWidth och CanvasHeight databundits till egenskaperna Width och Height för DrawingView, respektive. Den fullständiga lösningen finns i exempelprogrammet .NET MAUI Community Toolkit.
Hantera händelse när ritningslinjen har slutförts
DrawingView gör det möjligt att prenumerera på händelser som OnDrawingLineCompleted. Motsvarande kommando DrawingLineCompletedCommand är också tillgängligt.
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);
};
Använda i en rullningsvy
När du använder DrawingView inuti en ScrollView kan touchinteraktionen med ScrollView ibland fångas upp på iOS. Detta kan undvikas genom att på iOS ställa in egenskapen ShouldDelayContentTouches till false enligt följande exempel:
Jag löste det här problemet genom att lägga till ios:ScrollView.ShouldDelayContentTouches="false" i ScrollView som innehåller DrawingView:
<ContentPage
xmlns:ios="clr-namespace:Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific;assembly=Microsoft.Maui.Controls">
<ScrollView ios:ScrollView.ShouldDelayContentTouches="false">
<DrawingView />
</ScrollView>
</ContentPage>
Mer information finns i ScrollView-innehållsdetaljer.
Avancerad användning
För att få full nytta tillhandahåller DrawingView metoder för att hämta bildströmmen för de ritade linjerna.
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);
Egenskaper
| Fastighet | Type | Description |
|---|---|---|
| Linjer | ObservableCollection<IDrawingLine> |
Samling av IDrawingLine som för närvarande finns på DrawingView |
| IsMultiLineModeEnabled | bool |
Växlar flerradsläge. Om detta är aktiverat kan flera linjer ritas på DrawingView, även om tryck/klick släpps mellan linjerna. Obs! När ClearOnFinish också är aktiverat tas raderna bort när tryckningen/klicket släpps. Dessutom utlöses DrawingLineCompletedCommand efter varje rad som ritas. |
| ShouldClearOnFinish | bool |
Anger om DrawingView rensas efter att du har släppt trycket/klicket och en linje ritas. Obs! När IsMultiLineModeEnabled är också aktiverat kan detta orsaka oväntat beteende. |
| DrawingLineStartedCommand | ICommand |
Det här kommandot anropas när ritningen av en rad på DrawingView har startats. |
| RitaLinjeAvbrutenKommando | ICommand |
Det här kommandot anropas när ritningen av en linje på DrawingView har avbrutits. |
| DrawingLineCompletedCommand | ICommand |
Det här kommandot anropas när ritningen av en rad på DrawingView har slutförts. . Observera att detta utlöses efter att trycket eller klicket släpps. När MultiLineMode är aktiverat utlöses det här kommandot flera gånger. |
| PointDrawnCommand | ICommand |
Det här kommandot anropas när ritningen av en punkt på DrawingView har slutförts. |
| NärLinjeritningStartade | EventHandler<DrawingLineStartedEventArgs> |
DrawingView-händelsen inträffar när linjeritning startas. |
| När ritning av linje avbröts | EventHandler<EventArgs> |
DrawingView Händelsen inträffar när linjeritning avbryts. |
| OnDrawingLineCompleted | EventHandler<DrawingLineCompletedEventArgs> |
DrawingView händelsen inträffar när ritningslinjen har slutförts. |
| OnPointDrawn | EventHandler<PointDrawnEventArgs> |
DrawingView händelsen inträffar när en punkt ritas. |
| LineColor | Color |
Den färg som används som standard för att rita en linje på DrawingView. |
| Linjebredd | float |
Bredden som används som standard för att rita en linje på DrawingView. |
Ritlinje
DrawingLine innehåller listan med punkter och gör det möjligt att konfigurera varje linjestil individuellt.
Egenskaper
| Fastighet | Type | Description | Standardvärde |
|---|---|---|---|
| LineColor | Color |
Den färg som används för att rita linjen på DrawingView. |
Colors.Black |
| Linjebredd | float |
Bredden som används för att rita linjen på DrawingView. |
5 |
| Poäng | ObservableCollection<PointF> |
Samlingen av PointF som bildar raden. |
new() |
| Detaljeringsgrad | int |
Detaljnivån på den här raden. Minsta värde är 5. Desto högre värde, desto jämnare linje, desto långsammare blir programmet. | 5 |
| SkaJämnaUtBananNärDenRitas | bool |
Aktiverar eller inaktiverar om den här linjen är utjämnad (aliasskyddad) när den ritas. | false |
Anpassad IDrawingLine
Det finns två steg för att ersätta standardvärdet DrawingLine med den anpassade implementeringen:
- Skapa anpassad klass som implementerar
IDrawingLine:public class MyDrawingLine : IDrawingLine { public ObservableCollection<PointF> Points { get; } = new(); ... } - Skapa en anpassad klass som implementerar
IDrawingLineAdapter.public class MyDrawingLineAdapter : IDrawingLineAdapter { public IDrawingLine(MauiDrawingLine mauiDrawingLine) { return new MyDrawingLine { Points = mauiDrawingLine.Points, ... } } } - Ange anpassad
IDrawingLineAdapteriIDrawingViewHandler:var myDrawingLineAdapter = new MyDrawingLineAdapter(); drawingViewHandler.SetDrawingLineAdapter(myDrawingLineAdapter);
DrawingLineStartedEventArgs
Händelseargument som innehåller senaste ritpunkt.
Egenskaper
| Fastighet | Type | Description |
|---|---|---|
| Point | PointF |
Sista ritningspunkten. |
DrawingLineCompletedEventArgs
Händelseargument som innehåller den sista ritningslinjen.
Egenskaper
| Fastighet | Type | Description |
|---|---|---|
| LastDrawingLine | IDrawingLine |
Sista ritningslinjen. |
PointDrawnEventArgs
Händelseargument som innehåller den sista ritpunkten.
Egenskaper
| Fastighet | Type | Description |
|---|---|---|
| Point | PointF |
Sista ritningspunkten. |
Methods
| Metod | Description |
|---|---|
| GetImageStream | Hämtar en Stream som innehåller en avbildning av de Lines som för närvarande är ritade på DrawingView. |
| GetImageStream (statisk) | Hämtar en Stream som innehåller en avbildning av samlingen med IDrawingLine som anges som parameter. |
Exempel
Du hittar ett exempel på den här funktionen i praktiken i .NET MAUI Community Toolkit Sample Application.
API
Källkoden för DrawingView finns på lagringsplatsen .NET MAUI Community Toolkit GitHub.
.NET MAUI Community Toolkit