Bagikan melalui


Mengenali gerakan seret dan letakkan

Pengenal gerakan seret dan jatuhkan .NET Multi-platform App UI (.NET MAUI) memungkinkan item, dan paket data terkait, untuk diseret dari satu lokasi pada layar ke lokasi lain menggunakan gerakan berkelanjutan. Seret dan letakkan dapat terjadi dalam satu aplikasi, atau dapat dimulai dalam satu aplikasi dan berakhir di aplikasi lain.

Sumber seret, yang merupakan elemen tempat gerakan seret dimulai, dapat menyediakan data untuk ditransfer dengan mengisi objek paket data. Saat sumber seret dilepaskan, penurunan terjadi. Target drop, yang merupakan elemen di bawah sumber seret, lalu memproses paket data.

Proses untuk mengaktifkan seret dan letakkan di aplikasi adalah sebagai berikut:

  1. Aktifkan seret pada elemen dengan menambahkan DragGestureRecognizer objek ke koleksinya GestureRecognizers . Untuk informasi selengkapnya, lihat Mengaktifkan seret.
  2. [opsional] Buat paket data. .NET MAUI secara otomatis mengisi paket data untuk kontrol gambar dan teks, tetapi untuk konten lain Anda harus membuat paket data Anda sendiri. Untuk informasi selengkapnya, lihat Membangun paket data.
  3. Aktifkan drop pada elemen dengan menambahkan DropGestureRecognizer objek ke koleksinya GestureRecognizers . Untuk informasi selengkapnya, lihat Mengaktifkan drop.
  4. [opsional] DropGestureRecognizer.DragOver Tangani peristiwa untuk menunjukkan jenis operasi yang diizinkan oleh target penghilangan. Untuk informasi selengkapnya, lihat Menangani peristiwa DragOver.
  5. [opsional] Proses paket data untuk menerima konten yang dihilangkan. .NET MAUI akan secara otomatis mengambil data gambar dan teks dari paket data, tetapi untuk konten lain Anda harus memproses paket data. Untuk informasi selengkapnya, lihat Memproses paket data.

Aktifkan seret

Di .NET MAUI, pengenalan gerakan seret disediakan oleh DragGestureRecognizer kelas . Kelas ini mendefinisikan properti berikut:

Properti ini didukung oleh BindableProperty objek, yang berarti bahwa properti ini dapat menjadi target pengikatan data, dan ditata.

Kelas DragGestureRecognizer juga mendefinisikan DragStarting dan DropCompleted peristiwa yang diaktifkan jika CanDrag properti adalah true. DragGestureRecognizer Saat objek mendeteksi gerakan seret, objek menjalankan DragStartingCommand dan memanggil DragStarting peristiwa. Kemudian, ketika DragGestureRecognizer objek mendeteksi penyelesaian gerakan drop, objek menjalankan DropCompletedCommand dan memanggil DropCompleted peristiwa.

Objek DragStartingEventArgs yang menyertai DragStarting peristiwa menentukan properti berikut:

  • Cancel, dari jenis bool, menunjukkan apakah acara harus dibatalkan.
  • Data, dari jenis DataPackage, menunjukkan paket data yang menyertai sumber seret. Ini adalah properti baca-saja.
  • PlatformArgs, dari jenis PlatformDragStartingEventArgs?, mewakili argumen khusus platform yang terkait dengan peristiwa.

Di Android, PlatformDragStartingEventArgs kelas menentukan properti berikut:

  • Sender, dari jenis View, mewakili tampilan asli yang dilampirkan ke peristiwa.
  • MotionEvent, dari jenis MotionEvent, mewakili peristiwa yang berisi informasi untuk status seret dan letakkan.

Selain itu, di Android PlatformDragStartingEventArgs kelas mendefinisikan metode berikut:

  • SetDragShadowBuilder, yang mengatur View.DragShadowBuilder untuk digunakan saat menyeret dimulai.
  • SetClipData, yang mengatur ClipData untuk digunakan saat menyeret dimulai.
  • SetLocalData, yang mengatur data lokal yang akan digunakan saat menyeret dimulai.
  • SetDragFlags, yang mengatur DragFlags untuk digunakan saat menyeret dimulai.

Misalnya, gunakan SetClipData metode untuk mengaitkan ClipData dengan item yang diseret:

void OnDragStarting(object sender, DragStartingEventArgs e)
{
#if ANDROID
    string content = "insert your content here";
    e.PlatformArgs.SetClipData(Android.Content.ClipData.NewPlainText("Drag data", content));
#endif
}

Objek DropCompletedEventArgs yang menyertai DropCompleted peristiwa mendefinisikan PlatformArgs properti, jenis PlatformDropCompletedEventArgs?, yang mewakili argumen khusus platform yang terkait dengan peristiwa.

Di Android, PlatformDropCompletedEventArgs kelas menentukan properti berikut:

  • Sender, dari jenis View, mewakili tampilan asli yang dilampirkan ke peristiwa.
  • DragEvent, dari jenis DragEvent, mewakili peristiwa yang dikirim pada berbagai waktu selama operasi seret dan letakkan.

Contoh XAML berikut menunjukkan yang DragGestureRecognizer dilampirkan ke Image:

<Image Source="monkeyface.png">
    <Image.GestureRecognizers>
        <DragGestureRecognizer />
    </Image.GestureRecognizers>
</Image>

Dalam contoh ini, gerakan seret dapat dimulai pada Image.

Tip

Gerakan seret dimulai dengan tekan lama diikuti dengan seret.

Membangun paket data

.NET MAUI akan secara otomatis membangun paket data untuk Anda, ketika seret dimulai, untuk kontrol berikut:

Tabel berikut ini memperlihatkan properti yang dibaca, dan konversi apa pun yang dicoba, saat seret dimulai pada kontrol teks:

Menguasai Properti Konversi
CheckBox IsChecked bool dikonversi ke string.
DatePicker Date DateTime dikonversi ke string.
Editor Text
Entry Text
Label Text
RadioButton IsChecked bool dikonversi ke string.
Switch IsToggled bool dikonversi ke string.
TimePicker Time TimeSpan dikonversi ke string.

Untuk konten selain teks dan gambar, Anda harus membuat paket data sendiri.

Paket data diwakili oleh DataPackage kelas , yang menentukan properti berikut:

Kelas DataPackagePropertySet mewakili tas properti yang disimpan sebagai Dictionary<string,object>. Untuk informasi tentang DataPackageView kelas , lihat Memproses paket data.

Menyimpan data gambar atau teks

Data gambar atau teks dapat dikaitkan dengan sumber seret dengan menyimpan data di DataPackage.Image properti atau DataPackage.Text . Anda dapat menambahkan data di handler untuk peristiwa tersebut DragStarting .

Contoh XAML berikut menunjukkan DragGestureRecognizer yang mendaftarkan handler untuk peristiwa:DragStarting

<Path Stroke="Black"
      StrokeThickness="4">
    <Path.GestureRecognizers>
        <DragGestureRecognizer DragStarting="OnDragStarting" />
    </Path.GestureRecognizers>
    <Path.Data>
        <!-- PathGeometry goes here -->
    </Path.Data>
</Path>

Dalam contoh ini, DragGestureRecognizer dilampirkan ke Path objek. Peristiwa DragStarting dinaikkan ketika gerakan seret terdeteksi pada Path, yang menjalankan penanganan OnDragStarting aktivitas:

void OnDragStarting(object sender, DragStartingEventArgs e)
{
    e.Data.Text = "My text data goes here";
}

Objek DragStartingEventArgs yang menyertai DragStarting peristiwa memiliki Data properti, jenis DataPackage. Dalam contoh ini, Text properti DataPackage objek diatur ke string. kemudian DataPackage dapat diakses saat dihilangkan, untuk mengambil string.

Menyimpan data di tas properti

Data apa pun, termasuk gambar dan teks, dapat dikaitkan dengan sumber seret dengan menyimpan data dalam DataPackage.Properties koleksi. Anda dapat menambahkan data di handler untuk peristiwa tersebut DragStarting .

Contoh XAML berikut menunjukkan DragGestureRecognizer yang mendaftarkan handler untuk peristiwa:DragStarting

<Rectangle Stroke="Red"
           Fill="DarkBlue"
           StrokeThickness="4"
           HeightRequest="200"
           WidthRequest="200">
    <Rectangle.GestureRecognizers>
        <DragGestureRecognizer DragStarting="OnDragStarting" />
    </Rectangle.GestureRecognizers>
</Rectangle>

Dalam contoh ini, DragGestureRecognizer dilampirkan ke Rectangle objek. Peristiwa DragStarting dinaikkan ketika gerakan seret terdeteksi pada Rectangle, yang menjalankan penanganan OnDragStarting aktivitas:

void OnDragStarting(object sender, DragStartingEventArgs e)
{
    Shape shape = (sender as Element).Parent as Shape;
    e.Data.Properties.Add("Square", new Square(shape.Width, shape.Height));
}

Objek DragStartingEventArgs yang menyertai DragStarting peristiwa memiliki Data properti, jenis DataPackage. Kumpulan Properties DataPackage objek, yang merupakan Dictionary<string, object> koleksi, dapat dimodifikasi untuk menyimpan data yang diperlukan. Dalam contoh ini, Properties kamus dimodifikasi untuk menyimpan Square objek yang mewakili ukuran Rectangle terhadap kunci "Persegi".

Aktifkan penghilangan

Di .NET MAUI, pengenalan gerakan jatuh disediakan oleh DropGestureRecognizer kelas . Kelas ini mendefinisikan properti berikut:

  • AllowDrop, dari jenis bool, yang menunjukkan apakah elemen yang dilampirkan oleh pengenal gerakan dapat menjadi target penurunan. Nilai default properti ini adalah true.
  • DragOverCommand, dari jenis ICommand, yang dijalankan ketika sumber seret diseret ke target drop.
  • DragOverCommandParameter, dari jenis object, yang merupakan parameter yang diteruskan ke DragOverCommand.
  • DragLeaveCommand, dari jenis ICommand, yang dijalankan ketika sumber seret diseret dari target pengantaran.
  • DragLeaveCommandParameter, dari jenis object, yang merupakan parameter yang diteruskan ke DragLeaveCommand.
  • DropCommand, dari jenis ICommand, yang dijalankan ketika sumber seret dihilangkan di atas target drop.
  • DropCommandParameter, dari jenis object, yang merupakan parameter yang diteruskan ke DropCommand.

Properti ini didukung oleh BindableProperty objek, yang berarti bahwa properti ini dapat menjadi target pengikatan data, dan ditata.

Kelas juga DropGestureRecognizer mendefinisikan DragOver, DragLeave, dan Drop peristiwa yang diaktifkan jika AllowDrop properti adalah true. DropGestureRecognizer Saat mengenali sumber seret di atas target penghilanganDragOverCommand, sumber tersebut menjalankan dan memanggil DragOver peristiwa. Kemudian, jika sumber seret diseret dari target pengantaran, menjalankan DropGestureRecognizer DragLeaveCommand dan memanggil DragLeave peristiwa. Akhirnya, ketika DropGestureRecognizer mengenali gerakan jatuh di atas target drop, ia menjalankan DropCommand dan memanggil Drop peristiwa.

Kelas DragEventArgs , yang menyertai DragOver peristiwa dan DragLeave , menentukan properti berikut:

  • Data, dari jenis DataPackage, yang berisi data yang terkait dengan sumber seret. Properti ini bersifat hanya baca.
  • AcceptedOperation, dari jenis DataPackageOperation, yang menentukan operasi mana yang diizinkan oleh target penurunan.
  • PlatformArgs, dari jenis PlatformDragEventArgs?, mewakili argumen khusus platform yang terkait dengan peristiwa.

Di Android, PlatformDragEventArgs kelas menentukan properti berikut:

  • Sender, dari jenis View, mewakili tampilan asli yang dilampirkan ke peristiwa.
  • DragEvent, dari jenis DragEvent, mewakili peristiwa yang dikirim pada berbagai waktu selama operasi seret dan letakkan.

Untuk informasi tentang DataPackageOperation enumerasi, lihat Menangani peristiwa DragOver.

Kelas DropEventArgs yang menyertai Drop peristiwa menentukan properti berikut:

  • Data, dari jenis DataPackageView, yang merupakan versi baca-saja dari paket data.
  • Handled, dari jenis bool, menunjukkan apakah penanganan aktivitas telah menangani peristiwa atau apakah .NET MAUI harus melanjutkan pemrosesannya sendiri.
  • PlatformArgs, dari jenis PlatformDropEventArgs?, mewakili argumen khusus platform yang terkait dengan peristiwa.

Di Android, PlatformDropEventArgs kelas menentukan properti berikut:

  • Sender, dari jenis View, mewakili tampilan asli yang dilampirkan ke peristiwa.
  • DragEvent, dari jenis DragEvent, mewakili peristiwa yang dikirim pada berbagai waktu selama operasi seret dan letakkan.

Contoh XAML berikut menunjukkan yang DropGestureRecognizer dilampirkan ke Image:

<Image BackgroundColor="Silver"
       HeightRequest="300"
       WidthRequest="250">
    <Image.GestureRecognizers>
        <DropGestureRecognizer />
    </Image.GestureRecognizers>
</Image>

Dalam contoh ini, ketika sumber seret dihilangkan pada Image target drop, sumber seret akan disalin ke target drop jika sumber seret adalah ImageSource. .NET MAUI secara otomatis menyalin gambar dan teks yang diseret, ke target penurunan yang kompatibel.

Menangani peristiwa DragOver

Peristiwa DropGestureRecognizer.DragOver dapat ditangani secara opsional untuk menunjukkan jenis operasi mana yang diizinkan oleh target penghilangan. Anda dapat menunjukkan operasi yang diizinkan dengan mengatur AcceptedOperation properti, jenis DataPackageOperation, pada DragEventArgs objek yang menyertai DragOver peristiwa.

Enumerasi DataPackageOperation menentukan anggota berikut:

  • None, menunjukkan bahwa tidak ada tindakan yang akan dilakukan.
  • Copy, menunjukkan bahwa konten sumber seret akan disalin ke target drop.

Penting

DragEventArgs Saat objek dibuat, AcceptedOperation properti default ke DataPackageOperation.Copy.

Contoh XAML berikut menunjukkan DropGestureRecognizer yang mendaftarkan handler untuk peristiwa:DragOver

<Image BackgroundColor="Silver"
       HeightRequest="300"
       WidthRequest="250">
    <Image.GestureRecognizers>
        <DropGestureRecognizer DragOver="OnDragOver" />
    </Image.GestureRecognizers>
</Image>

Dalam contoh ini, DropGestureRecognizer dilampirkan ke Image objek. Peristiwa DragOver dinaikkan saat sumber seret diseret di atas target drop, tetapi belum dihilangkan, yang menjalankan OnDragOver penanganan aktivitas:

void OnDragOver(object sender, DragEventArgs e)
{
    e.AcceptedOperation = DataPackageOperation.None;
}

Dalam contoh ini, AcceptedOperation properti DragEventArgs objek diatur ke DataPackageOperation.None. Nilai ini memastikan bahwa tidak ada tindakan yang diambil saat sumber seret dijatuhkan ke target penurunan.

Memproses paket data

Peristiwa Drop dinaikkan saat sumber seret dirilis melalui target drop. .NET MAUI secara otomatis mencoba mengambil data dari paket data ketika sumber seret dihilangkan ke kontrol berikut:

Tabel berikut ini memperlihatkan properti yang diatur dan konversi apa pun yang dicoba saat sumber seret berbasis teks dihilangkan pada kontrol teks:

Menguasai Properti Konversi
CheckBox IsChecked string dikonversi menjadi bool.
DatePicker Date string dikonversi menjadi DateTime.
Editor Text
Entry Text
Label Text
RadioButton IsChecked string dikonversi menjadi bool.
Switch IsToggled string dikonversi menjadi bool.
TimePicker Time string dikonversi menjadi TimeSpan.

Untuk konten selain teks dan gambar, Anda harus memproses paket data sendiri.

Kelas DropEventArgs yang menyertai Drop peristiwa mendefinisikan Data properti, jenis DataPackageView. Properti ini mewakili versi baca-saja dari paket data.

Mengambil data gambar atau teks

Data gambar atau teks dapat diambil dari paket data di handler untuk Drop peristiwa, menggunakan metode yang ditentukan di DataPackageView kelas .

Kelas DataPackageView ini mencakup GetImageAsync metode dan GetTextAsync . Metode mengambil GetImageAsync gambar dari paket data yang disimpan di DataPackage.Image properti dan mengembalikan Task<ImageSource>. Demikian pula, metode mengambil GetTextAsync teks dari paket data yang disimpan di DataPackage.Text properti dan mengembalikan Task<string>.

Contoh berikut menunjukkan penanganan Drop aktivitas yang mengambil teks dari paket data untuk Path:

async void OnDrop(object sender, DropEventArgs e)
{
    string text = await e.Data.GetTextAsync();

    // Perform logic to take action based on the text value.
}

Dalam contoh ini, data teks diambil dari paket data menggunakan GetTextAsync metode . Tindakan berdasarkan nilai teks kemudian dapat diambil.

Mengambil data dari tas properti

Data apa pun dapat diambil dari paket data di handler untuk peristiwa tersebut Drop , dengan mengakses Properties pengumpulan paket data.

Kelas DataPackageView mendefinisikan Properties properti, jenis DataPackagePropertySetView. Kelas DataPackagePropertySetView mewakili tas properti baca-saja yang disimpan sebagai Dictionary<string, object>.

Contoh berikut menunjukkan penanganan Drop aktivitas yang mengambil data dari kantong properti paket data untuk Rectangle:

void OnDrop(object sender, DropEventArgs e)
{
    Square square = (Square)e.Data.Properties["Square"];

    // Perform logic to take action based on retrieved value.
}

Dalam contoh ini, Square objek diambil dari tas properti paket data, dengan menentukan kunci kamus "Persegi". Tindakan berdasarkan nilai yang diambil kemudian dapat diambil.

Seret dan letakkan di antara aplikasi

Di iOS, Mac Catalyst, dan Windows, seret dapat dimulai dalam satu aplikasi dengan operasi penurunan yang sesuai yang berakhiran aplikasi .NET MAUI. Aplikasi tempat item diseret adalah aplikasi sumber , dan aplikasi .NET MAUI tempat item dihilangkan adalah aplikasi tujuan .

Tidak dimungkinkan untuk menyeret dari aplikasi sumber ke aplikasi tujuan .NET MAUI di Android.

Dapatkan posisi gerakan

Posisi di mana gerakan seret atau letakkan terjadi dapat diperoleh dengan memanggil GetPosition metode pada DragEventArgsobjek , , DragStartingEventArgsatau DropEventArgs . Metode GetPosition menerima Element? argumen, dan mengembalikan posisi sebagai Point? objek:

void OnDragStarting(object sender, DragStartingEventArgs e)
{
    // Position relative to screen
    Point? screenPosition = e.GetPosition(null);

    // Position relative to specified element
    Point? relativeToImagePosition = e.GetPosition(image);
}

Argumen Element? mendefinisikan elemen yang harus diperoleh relatif terhadap posisi. Menyediakan null nilai sebagai argumen ini berarti bahwa GetPosition metode mengembalikan Point? objek yang menentukan posisi gerakan seret atau jatuhkan relatif terhadap layar.