Partager via


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 :

Capture d’écran d’un DrawingView 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 :

Capture d’écran d’un DrawingView avec plusieurs lignes 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 :

  1. Créez une classe personnalisée qui implémente IDrawingLine :
    public class MyDrawingLine : IDrawingLine
    {
        public ObservableCollection<PointF> Points { get; } = new();
        ...
    }
    
  2. Créez une classe personnalisée qui implémente IDrawingLineAdapter.
    public class MyDrawingLineAdapter : IDrawingLineAdapter
    {
        public IDrawingLine(MauiDrawingLine mauiDrawingLine)
        {
            return new MyDrawingLine
            {
                Points = mauiDrawingLine.Points,
                ...
            }
        }
    }
    
  3. Définir un IDrawingLineAdapter personnalisé dans IDrawingViewHandler :
    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.