DrawingView
DrawingView
bietet eine Oberfläche, die das Zeichnen von Linien über die Verwendung von Touch- oder Mausinteraktionen ermöglicht. Das Ergebnis einer Benutzerzeichnung kann als Bild gespeichert werden.
Ein gängiger Anwendungsfall dafür ist das Bereitstellen eines Unterschriftenfelds in einer Anwendung.
Grundlegende Verwendung
DrawingView
ermöglicht das Festlegen von Linienfarbe, Linienbreite und Bindung an die Liniensammlung.
XAML
Einbinden des XAML-Namespace
Um das Toolkit in XAML verwenden zu können, muss der folgende xmlns
-Abschnitt zu Ihrer Seite oder Ansicht hinzugefügt werden:
xmlns:toolkit="http://schemas.microsoft.com/dotnet/2022/maui/toolkit"
Der folgende Abschnitt:
<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>
Würde dann geändert werden, um xmlns
einzubinden:
<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>
Verwenden von 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
};
Der folgende Screenshot zeigt das „DrawingView“-Ergebnis unter Android:
MultiLine-Verwendung
Standardmäßig unterstützt DrawingView
nur 1 Linie. Um MultiLine
zu aktivieren, legen Sie IsMultiLineModeEnabled
auf „true“ fest. Stellen Sie sicher, dass ShouldClearOnFinish
„false“ ist.
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,
};
Der folgende Screenshot zeigt das „DrawingView“-Ergebnis unter Android:
Behandeln von Ereignissen bei Abschluss der Linienzeichnung
DrawingView
ermöglicht das Abonnieren von Ereignissen wie OnDrawingLineCompleted
. Der entsprechende Befehl DrawingLineCompletedCommand
ist ebenfalls verfügbar.
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);
};
Verwenden in ScrollView
Bei Verwendung von DrawingView
innerhalb von ScrollView
kann die Touchinteraktion mit ScrollView
unter iOS manchmal abgefangen werden. Das kann verhindert werden, indem die Eigenschaft ShouldDelayContentTouches
unter iOS wie im folgenden Beispiel auf false
festgelegt wird:
Ich habe dieses Problem gelöst, indem ich ios:ScrollView.ShouldDelayContentTouches="false" zum ScrollView-Objekt hinzugefügt habe, das DrawingView enthält:
<ContentPage
xmlns:ios="clr-namespace:Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific;assembly=Microsoft.Maui.Controls">
<ScrollView ios:ScrollView.ShouldDelayContentTouches="false">
<DrawingView />
</ScrollView>
</ContentPage>
Weitere Informationen finden Sie unter ScrollView-Inhaltseingaben.
Erweiterte Verwendung
Um die vollständigen Vorteile zu erhalten, stellt DrawingView
die Methoden zum Abrufen des Bilddatenstroms der gezeichneten Linien bereit.
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);
Eigenschaften
Eigenschaft | Typ | Beschreibung |
---|---|---|
Positionen | ObservableCollection<IDrawingLine> |
Sammlung von IDrawingLine , die derzeit in der DrawingView sind |
IsMultiLineModeEnabled | bool |
Schaltet den Mehrlinienmodus um. Bei „true“ können mehrere Linien auf der DrawingView gezeichnet werden, wobei das Tippen/Klicken zwischen den Linien losgelassen wird. Hinweis: Wenn ClearOnFinish ebenfalls aktiviert ist, werden die Linien gelöscht, nachdem das Tippen/Klicken losgelassen wird. Zudem wird DrawingLineCompletedCommand nach jeder gezeichneten Linie ausgelöst. |
ShouldClearOnFinish | bool |
Gibt an, ob die DrawingView gelöscht wird, nachdem das Tippen/Klicken losgelassen wird, und eine Linie gezeichnet wird. Hinweis: Wenn IsMultiLineModeEnabled ebenfalls aktiviert ist, kann dies zu unerwartetem Verhalten führen. |
DrawingLineStartedCommand | ICommand |
Dieser Befehl wird immer aufgerufen, wenn die Zeichnung einer Linie auf der DrawingView gestartet wurde. |
DrawingLineCancelledCommand | ICommand |
Dieser Befehl wird immer aufgerufen, wenn die Zeichnung einer Linie auf der DrawingView abgebrochen wurde. |
DrawingLineCompletedCommand | ICommand |
Dieser Befehl wird immer aufgerufen, wenn die Zeichnung einer Linie auf der DrawingView abgeschlossen wurde. . Beachten Sie, dass der Befehl ausgelöst wird, nachdem das Tippen oder Klicken beendet wurde. Wenn MultiLineMode aktiviert ist, wird dieser Befehl mehrmals ausgelöst. |
PointDrawnCommand | ICommand |
Dieser Befehl wird immer aufgerufen, wenn die Zeichnung eines Punkts auf der DrawingView abgeschlossen wurde. |
OnDrawingLineStarted | EventHandler<DrawingLineStartedEventArgs> |
Das DrawingView -Ereignis tritt auf, wenn mit dem Zeichnen einer Linie begonnen wurde. |
OnDrawingLineCancelled | EventHandler<EventArgs> |
Das DrawingView -Ereignis tritt auf, wenn das Zeichnen einer Linie abgebrochen wurde. |
OnDrawingLineCompleted | EventHandler<DrawingLineCompletedEventArgs> |
Das DrawingView -Ereignis tritt auf, wenn das Zeichnen einer Linie abgeschlossen wurde. |
OnPointDrawn | EventHandler<PointDrawnEventArgs> |
Das DrawingView -Ereignis tritt auf, wenn ein Punkt gezeichnet wurde. |
LineColor | Color |
Die Farbe, die standardmäßig zum Zeichnen einer Linie auf der DrawingView verwendet wird. |
LineWidth | float |
Die Breite, die standardmäßig zum Zeichnen einer Linie auf der DrawingView verwendet wird. |
DrawingLine
Die DrawingLine
enthält die Liste von Punkten und ermöglicht es, jeden Linienstil individuell zu konfigurieren.
Eigenschaften
Eigenschaft | Typ | BESCHREIBUNG | Standardwert |
---|---|---|---|
LineColor | Color |
Die Farbe, die zum Zeichnen der Linie auf der DrawingView verwendet wird. |
Colors.Black |
LineWidth | float |
Die Breite, die zum Zeichnen der Linie auf der DrawingView verwendet wird. |
5 |
Punkte | ObservableCollection<PointF> |
Die Sammlung von PointF , die die Linie bildet. |
new() |
Granularität | int |
Die Granularität dieser Linie. Mindestwert ist 5. Je höher der Wert, desto glatter die Linie, desto langsamer das Programm. | 5 |
ShouldSmoothPathWhenDrawn | bool |
Aktiviert oder deaktiviert, ob diese Linie beim Zeichnen geglättet wird (Antialiasing). | false |
Benutzerdefinierte IDrawingLine
Es gibt zwei Schritte, um die standardmäßige DrawingLine
durch die benutzerdefinierte Implementierung zu ersetzen:
- Erstellen Sie eine benutzerdefinierte Klasse, die
IDrawingLine
implementiert:public class MyDrawingLine : IDrawingLine { public ObservableCollection<PointF> Points { get; } = new(); ... }
- Erstellen Sie eine benutzerdefinierte Klasse, die
IDrawingLineAdapter
implementiert.public class MyDrawingLineAdapter : IDrawingLineAdapter { public IDrawingLine(MauiDrawingLine mauiDrawingLine) { return new MyDrawingLine { Points = mauiDrawingLine.Points, ... } } }
- Legen Sie einen benutzerdefinierten
IDrawingLineAdapter
imIDrawingViewHandler
fest:var myDrawingLineAdapter = new MyDrawingLineAdapter(); drawingViewHandler.SetDrawingLineAdapter(myDrawingLineAdapter);
DrawingLineStartedEventArgs
Ereignisargument, das den letzten gezeichneten Punkt enthält.
Eigenschaften
Eigenschaft | Typ | Beschreibung |
---|---|---|
Point | PointF |
Letzter gezeichneter Punkt. |
DrawingLineCompletedEventArgs
Ereignisargument, das die letzte gezeichnete Linie enthält.
Eigenschaften
Eigenschaft | Typ | Beschreibung |
---|---|---|
LastDrawingLine | IDrawingLine |
Letzte gezeichnete Linie. |
PointDrawnEventArgs
Ereignisargument, das den letzten gezeichneten Punkt enthält.
Eigenschaften
Eigenschaft | Typ | Beschreibung |
---|---|---|
Point | PointF |
Letzter gezeichneter Punkt. |
Methoden
Methode | Beschreibung |
---|---|
GetImageStream | Ruft einen Stream ab, der ein Bild der Lines enthält, die derzeit auf der DrawingView gezeichnet werden. |
GetImageStream (static) | Ruft einen Stream ab, der ein Bild der Sammlung von IDrawingLine enthält, die als Parameter bereitgestellt wird. |
Beispiele
Sie finden ein Beispiel für dieses Feature in Aktion in der Beispielanwendung für das .NET MAUI Community Toolkit.
API
Sie finden den Quellcode für DrawingView
über das GitHub-Repository für das .NET MAUI Community Toolkit.
.NET MAUI Community Toolkit