DrawingView
DrawingView
fournit une surface qui permet de dessiner des traits à la main ou à l’aide de la souris. Le résultat d’un dessin réalisé par un utilisateur peut être enregistré sous forme d’image.
Un cas d’usage courant est de fournir une zone de signature dans une application.
Utilisation de base
DrawingView
permet de définir la couleur du trait, la largeur du trait et la liaison à la collection de traits.
XAML
Y compris l’espace de noms XAML
Pour utiliser le kit de ressources dans XAML, le xmlns
suivant doit être ajouté à votre page ou à votre affichage :
xmlns:toolkit="http://schemas.microsoft.com/dotnet/2022/maui/toolkit"
Il en résulte ce qui suit :
<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>
Serait modifié pour inclure le xmlns
de la manière suivante :
<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>
Utilisation de 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
};
La capture d’écran suivante montre le DrawingView qui en résulte sur Android :
Utilisation du mode multitrait
Par défaut, DrawingView
prend uniquement en charge 1 trait. Pour activer MultiLine
, définissez IsMultiLineModeEnabled
avec la valeur true. Vérifiez que ShouldClearOnFinish
a la valeur false.
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,
};
La capture d’écran suivante montre le DrawingView qui en résulte sur Android :
Gérer l’événement lorsque le trait du dessin est terminé
DrawingView
permet de s’abonner aux événements comme OnDrawingLineCompleted
. La commande correspondante DrawingLineCompletedCommand
est également disponible.
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);
};
Utiliser dans un ScrollView
Lors de l'utilisation de DrawingView
à l'intérieur d'un ScrollView
, l'interaction tactile avec le ScrollView
peut parfois être interceptée sur iOS. Cette interception peut être empêchée en définissant la propriété ShouldDelayContentTouches
sur iOS false
en fonction de l’exemple suivant :
J’ai résolu ce problème, en ajoutant l’ios:ScrollView.ShouldDelayContentTouches="false » au ScrollView qui contient DrawingView :
<ContentPage
xmlns:ios="clr-namespace:Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific;assembly=Microsoft.Maui.Controls">
<ScrollView ios:ScrollView.ShouldDelayContentTouches="false">
<DrawingView />
</ScrollView>
</ContentPage>
Pour plus d’informations, reportez-vous aux touches de contenus ScrollView.
Utilisation avancée
Pour bénéficier de tous les avantages, DrawingView
fournit les méthodes permettant d’obtenir le flux d’images des traits du dessin.
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);
Propriétés
Propriété | Type | Description |
---|---|---|
Lignes | ObservableCollection<IDrawingLine> |
Collection de IDrawingLine actuellement sur DrawingView |
IsMultiLineModeEnabled | bool |
Active le mode multitrait. Lorsque la valeur est true, plusieurs traits peuvent être dessinés sur DrawingView en relâchant l’appui/le clic entre les traits. Remarque : lorsque ClearOnFinish est également activé, les traits sont effacés après relâchement de l’appui/du clic. De plus, DrawingLineCompletedCommand est déclenché après chaque trait dessiné. |
ShouldClearOnFinish | bool |
Indique si DrawingView est effacé après relâchement de l’appui/du clic et une fois qu’un trait est dessiné. Remarque : lorsque IsMultiLineModeEnabled est également activé, cela risque d’entraîner un comportement inattendu. |
DrawingLineStartedCommand | ICommand |
Cette commande est appelée chaque fois que le dessin d’un trait sur DrawingView a commencé. |
DrawingLineCancelledCommand | ICommand |
Cette commande est appelée chaque fois que le dessin d’un trait sur DrawingView est annulé. |
DrawingLineCompletedCommand | ICommand |
Cette commande est appelée chaque fois que le dessin d’un trait sur DrawingView est terminé. . Notez qu’elle est déclenchée après relâchement de l’appui ou du clic. Lorsque MultiLineMode est activé, cette commande est déclenchée plusieurs fois. |
PointDrawnCommand | ICommand |
Cette commande est appelée chaque fois que le dessin d’un point sur DrawingView est terminé. |
OnDrawingLineStarted | EventHandler<DrawingLineStartedEventArgs> |
L’événement DrawingView se produit lorsqu’un trait de dessin est commencé. |
OnDrawingLineCancelled | EventHandler<EventArgs> |
L’événement DrawingView se produit lorsqu’un trait de dessin est annulé. |
OnDrawingLineCompleted | EventHandler<DrawingLineCompletedEventArgs> |
L’événement DrawingView se produit lorsque le trait de dessin est terminé. |
OnPointDrawn | EventHandler<PointDrawnEventArgs> |
L’événement DrawingView se produit lorsqu’un point est dessiné. |
LineColor | Color |
Couleur utilisée par défaut pour dessiner un trait sur DrawingView . |
LineWidth | float |
Largeur utilisée par défaut pour dessiner un trait sur DrawingView . |
DrawingLine
DrawingLine
contient la liste des points et permet de configurer chaque style de trait individuellement.
Propriétés
Propriété | Type | Description | Valeur par défaut |
---|---|---|---|
LineColor | Color |
Couleur utilisée pour dessiner le trait sur DrawingView . |
Colors.Black |
LineWidth | float |
Largeur utilisée pour dessiner le trait sur DrawingView . |
5 |
Points | ObservableCollection<PointF> |
Collection de PointF qui forme le trait. |
new() |
Granularité | int |
Précision du trait. La valeur minimale est de 5. Plus la valeur est élevée, plus le trait est régulier et plus le programme est lent. | 5 |
ShouldSmoothPathWhenDrawn | bool |
Active ou désactive si ce trait est régulier (lissé) lorsqu’il est dessiné. | false |
Custom IDrawingLine
Il existe 2 étapes pour remplacer le DrawingLine
par défaut par l’implémentation personnalisée :
- Créez une classe personnalisée qui implémente
IDrawingLine
:public class MyDrawingLine : IDrawingLine { public ObservableCollection<PointF> Points { get; } = new(); ... }
- Créez une classe personnalisée qui implémente
IDrawingLineAdapter
.public class MyDrawingLineAdapter : IDrawingLineAdapter { public IDrawingLine(MauiDrawingLine mauiDrawingLine) { return new MyDrawingLine { Points = mauiDrawingLine.Points, ... } } }
- Définir un
IDrawingLineAdapter
personnalisé dansIDrawingViewHandler
:var myDrawingLineAdapter = new MyDrawingLineAdapter(); drawingViewHandler.SetDrawingLineAdapter(myDrawingLineAdapter);
DrawingLineStartedEventArgs
Argument d’événement contenant le dernier point de dessin.
Propriétés
Propriété | Type | Description |
---|---|---|
Point | PointF |
Dernier point de dessin. |
DrawingLineCompletedEventArgs
Argument d’événement contenant le dernier trait de dessin.
Propriétés
Propriété | Type | Description |
---|---|---|
LastDrawingLine | IDrawingLine |
Dernier trait de dessin. |
PointDrawnEventArgs
Argument d’événement contenant le dernier point de dessin.
Propriétés
Propriété | Type | Description |
---|---|---|
Point | PointF |
Dernier point de dessin. |
Méthodes
méthode | Description |
---|---|
GetImageStream | Récupère un Stream contenant une image des Lines qui sont actuellement dessinés sur DrawingView . |
GetImageStream (statique) | Récupère un Stream contenant une image de la collection de IDrawingLine fournie en tant que paramètre. |
Exemples
Vous trouverez un exemple d’utilisation de cette fonctionnalité dans l’exemple d’application du toolkit de la communauté .NET MAUI.
API
Vous pouvez trouver le code source deDrawingView
sur le référentiel du kit de ressources de la communauté .NET MAUI sur GitHub.
.NET MAUI Community Toolkit