Bagikan melalui


GambarTampilan

menyediakan DrawingView permukaan yang memungkinkan gambar garis melalui penggunaan interaksi sentuhan atau mouse. Hasil gambar pengguna dapat disimpan sebagai gambar. Kasus penggunaan umum untuk ini adalah menyediakan kotak tanda tangan dalam aplikasi.

Penggunaan dasar

DrawingView memungkinkan untuk mengatur warna garis, lebar garis, dan mengikat ke kumpulan garis.

XAML

Menyertakan namespace XAML

Untuk menggunakan toolkit di XAML, hal berikut xmlns perlu ditambahkan ke halaman atau tampilan Anda:

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

Oleh karena itu hal-hal berikut:

<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>

Akan dimodifikasi untuk menyertakan xmlns sebagai berikut:

<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>

Menggunakan 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
};

Cuplikan layar berikut menunjukkan DrawingView yang dihasilkan di Android:

Cuplikan layar DrawingView di Android

Penggunaan MultiBaris

Secara default DrawingView hanya mendukung 1 baris. Untuk mengaktifkan MultiLine atur IsMultiLineModeEnabled ke true. Pastikan ShouldClearOnFinish salah.

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,
};

Cuplikan layar berikut menunjukkan DrawingView yang dihasilkan di Android:

Cuplikan layar DrawingView dengan multibaris di Android

Menangani peristiwa saat Garis Gambar Selesai

DrawingView memungkinkan untuk berlangganan peristiwa seperti OnDrawingLineCompleted. Perintah DrawingLineCompletedCommand yang sesuai juga tersedia.

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);
};

Gunakan dalam ScrollView

Saat menggunakan bagian DrawingView dalam ScrollView interaksi sentuh dengan ScrollView terkadang dapat dicegat di iOS. Ini dapat dicegah dengan mengatur properti ke ShouldDelayContentTouches false di iOS sesuai contoh berikut:

Saya memecahkan masalah ini, dengan menambahkan ios:ScrollView.ShouldDelayContentTouches="false" ke ScrollView yang berisi DrawingView:

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

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

        <DrawingView />

    </ScrollView>

</ContentPage>

Untuk informasi lebih lanjut, silakan merujuk ke sentuhan konten ScrollView.

Penggunaan tingkat lanjut

Untuk mendapatkan manfaat penuh, DrawingView menyediakan metode untuk mendapatkan aliran gambar dari garis gambar.

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);

Properti

Properti Tipe Deskripsi
Garis ObservableCollection<IDrawingLine> IDrawingLine Kumpulan yang saat ini ada diDrawingView
IsMultiLineModeEnabled bool Mengalihkan mode multibaris. Jika benar, beberapa garis dapat digambar saat DrawingView ketuk/klik dilepaskan di antara garis. Catatan: saat ClearOnFinish juga diaktifkan, garis dibersihkan setelah ketuk/klik dilepaskan. Selain itu, DrawingLineCompletedCommand akan ditembakkan setelah setiap baris yang digambar.
ShouldClearOnFinish bool Menunjukkan apakah DrawingView dibersihkan setelah melepaskan ketuk/klik dan garis digambar. Catatan: ketika IsMultiLineModeEnabled juga diaktifkan, ini dapat menyebabkan perilaku tak terduga.
DrawingLineStartedCommand ICommand Perintah ini dipanggil setiap kali gambar baris pada DrawingView telah dimulai.
DrawingLineCancelledCommand ICommand Perintah ini dipanggil setiap kali gambar baris pada DrawingView telah dibatalkan.
DrawingLineCompletedCommand ICommand Perintah ini dipanggil setiap kali gambar baris pada DrawingView telah selesai. . Perhatikan bahwa ini diaktifkan setelah ketukan atau klik diangkat. Ketika MultiLineMode diaktifkan, perintah ini diaktifkan beberapa kali.
PointDrawnCommand ICommand Perintah ini dipanggil setiap kali gambar titik pada DrawingView telah selesai.
OnDrawingLineStarted EventHandler<DrawingLineStartedEventArgs> DrawingView peristiwa terjadi saat garis gambar dimulai.
OnDrawingLineCancelled EventHandler<EventArgs> DrawingView peristiwa terjadi saat garis gambar dibatalkan.
OnDrawingLineCompleted EventHandler<DrawingLineCompletedEventArgs> DrawingView peristiwa terjadi saat garis gambar selesai.
OnPointDrawn EventHandler<PointDrawnEventArgs> DrawingView peristiwa terjadi ketika titik digambar.
Warna Garis Color Warna yang digunakan secara default untuk menggambar garis pada DrawingView.
LineWidth float Lebar yang digunakan secara default untuk menggambar garis pada DrawingView.

Garis Gambar

DrawingLine berisi daftar titik dan memungkinkan konfigurasi setiap gaya baris satu per satu.

Properti

Properti Tipe Deskripsi Nilai default
Warna Garis Color Warna yang digunakan untuk menggambar garis pada DrawingView. Colors.Black
LineWidth float Lebar yang digunakan untuk menggambar garis pada DrawingView. 5
Titik ObservableCollection<PointF> Koleksi PointF yang membuat garis. new()
Granularitas int Granularitas garis ini. Nilai min adalah 5. Semakin tinggi nilai, semakin halus garis, semakin lambat program. 5
ShouldSmoothPathWhenDrawn bool Mengaktifkan atau menonaktifkan jika baris ini dihaluskan (anti-alias) saat digambar. false

IDrawingLine Kustom

Ada 2 langkah untuk mengganti default DrawingLine dengan implementasi kustom:

  1. Buat kelas kustom yang mengimplementasikan IDrawingLine:
    public class MyDrawingLine : IDrawingLine
    {
        public ObservableCollection<PointF> Points { get; } = new();
        ...
    }
    
  2. Buat kelas kustom yang mengimplementasikan IDrawingLineAdapter.
    public class MyDrawingLineAdapter : IDrawingLineAdapter
    {
        public IDrawingLine(MauiDrawingLine mauiDrawingLine)
        {
            return new MyDrawingLine
            {
                Points = mauiDrawingLine.Points,
                ...
            }
        }
    }
    
  3. Atur kustom IDrawingLineAdapter di IDrawingViewHandler:
    var myDrawingLineAdapter = new MyDrawingLineAdapter();
    drawingViewHandler.SetDrawingLineAdapter(myDrawingLineAdapter);
    

DrawingLineStartedEventArgs

Argumen peristiwa yang berisi titik gambar terakhir.

Properti

Properti Tipe Deskripsi
Titik PointF Titik gambar terakhir.

DrawingLineCompletedEventArgs

Argumen peristiwa yang berisi baris gambar terakhir.

Properti

Properti Tipe Deskripsi
LastDrawingLine IDrawingLine Garis gambar terakhir.

PointDrawnEventArgs

Argumen peristiwa yang berisi titik gambar terakhir.

Properti

Properti Tipe Deskripsi
Titik PointF Titik gambar terakhir.

Metode

Metode Deskripsi
GetImageStream Mengambil gambar Stream Lines yang berisi gambar yang saat ini digambar pada DrawingView.
GetImageStream (statis) Mengambil gambar yang Stream berisi kumpulan IDrawingLine yang disediakan sebagai parameter.

Contoh

Anda dapat menemukan contoh fitur ini dalam tindakan di Aplikasi Sampel Toolkit Komunitas .NET MAUI.

API

Anda dapat menemukan kode sumber untuk DrawingView lebih pada repositori GitHub .NET MAUI Community Toolkit.