Bagikan melalui


Gambaran Umum Seret dan Letakkan

Topik ini memberikan gambaran umum tentang fitur drag-and-drop di aplikasi Windows Presentation Foundation (WPF). Seret dan letakkan biasanya mengacu pada metode transfer data yang melibatkan penggunaan mouse (atau beberapa perangkat penunjuk lainnya) untuk memilih satu atau beberapa objek, menyeret objek ini ke target letakkan yang diinginkan di antarmuka pengguna (UI), dan menjatuhkannya.

Dukungan Drag-and-Drop di WPF

Operasi seret dan letakkan biasanya melibatkan dua pihak: sumber seret tempat asal objek yang diseret dan sasaran letak yang menerima objek yang dijatuhkan. Sumber seret dan target jatuh dapat berupa elemen UI dalam aplikasi yang sama atau aplikasi yang berbeda.

Jenis dan jumlah objek yang dapat dimanipulasi dengan seret dan letakkan sepenuhnya sesuai keinginan. Misalnya, file, folder, dan pilihan konten adalah beberapa objek yang lebih umum dimanipulasi melalui operasi seret dan letakkan.

Tindakan-tindakan yang dilakukan selama operasi tarik dan lepas tergantung pada aplikasi, dan sering kali ditentukan oleh konteks. Misalnya, menyeret pilihan file dari satu folder ke folder lain pada perangkat penyimpanan yang sama memindahkan file secara default, sedangkan menyeret file dari berbagi Universal Naming Convention (UNC) ke folder lokal menyalin file secara default.

Fasilitas seret dan lepas yang disediakan oleh WPF dirancang agar sangat fleksibel dan mudah disesuaikan untuk mendukung berbagai skenario seret dan lepas. Seret dan letakkan mendukung manipulasi objek dalam satu aplikasi, atau di antara aplikasi yang berbeda. Menyeret-dan-menjatuhkan antara aplikasi WPF dan aplikasi Windows lainnya juga didukung sepenuhnya.

Di WPF, setiap UIElement atau ContentElement bisa digunakan dalam drag-and-drop. Event dan metode yang diperlukan untuk operasi seret-dan-letakkan ditentukan di kelas DragDrop. Kelas UIElement dan ContentElement berisi alias untuk peristiwa terlampir DragDrop sehingga peristiwa muncul dalam daftar anggota kelas saat UIElement atau ContentElement diwariskan sebagai elemen dasar. Pengendali acara yang terhubung ke event ini terhubung ke acara terlampir DragDrop yang mendasari dan menerima instance data acara yang sama. Untuk informasi selengkapnya, lihat peristiwa UIElement.Drop.

Penting

Fungsi seret dan lepas OLE tidak bekerja di zona Internet.

Data Transfer

Seret dan letakkan adalah bagian dari area transfer data yang lebih luas. Transfer data mencakup operasi seret dan letakkan serta salin dan tempel. Operasi seret dan letakkan dianalogikan dengan operasi salin dan tempel atau potong dan tempel yang digunakan untuk mentransfer data dari satu objek atau aplikasi ke objek lain dengan menggunakan clipboard sistem. Kedua jenis operasi memerlukan:

  • Objek sumber yang menyediakan data.

  • Cara untuk menyimpan data yang ditransfer untuk sementara waktu.

  • Objek target yang menerima data.

Dalam operasi salin dan tempel, clipboard sistem digunakan untuk menyimpan data yang ditransfer untuk sementara; dalam operasi seret dan letakkan, DataObject digunakan untuk menyimpan data. Secara konseptual, objek data terdiri dari satu atau beberapa pasangan Object yang berisi data aktual, dan pengidentifikasi format data yang sesuai.

Sumber seret memulai operasi seret dan letakkan dengan memanggil metode DragDrop.DoDragDrop yang bersifat statis dan meneruskan data yang ditransfer ke metode tersebut. Metode DoDragDrop akan secara otomatis membungkus data dalam DataObject jika perlu. Untuk kontrol yang lebih besar atas format data, Anda dapat membungkus data dalam DataObject sebelum meneruskannya ke metode DoDragDrop. Target penurunan bertanggung jawab untuk mengekstrak data dari DataObject. Untuk informasi selengkapnya tentang bekerja dengan objek data, lihat Data dan Objek Data.

Sumber dan target operasi seret dan letakkan adalah elemen UI; namun, data yang sebenarnya sedang ditransfer biasanya tidak memiliki representasi visual. Anda dapat menulis kode untuk memberikan representasi visual data yang diseret, seperti terjadi saat menyeret file di Windows Explorer. Secara default, umpan balik diberikan kepada pengguna dengan mengubah kursor untuk mewakili efek yang akan dimiliki operasi seret dan letakkan pada data, seperti apakah data akan dipindahkan atau disalin.

Efek Seret dan Letakkan

Operasi seret dan letakkan dapat memiliki efek yang berbeda pada data yang ditransfer. Misalnya, Anda dapat menyalin data atau Anda dapat memindahkan data. WPF mendefinisikan enumerasi DragDropEffects yang dapat Anda gunakan untuk menentukan efek dari operasi tarik-dan-jatuhkan. Di sumber drag, Anda dapat menentukan efek yang akan diizinkan oleh sumber dalam metode DoDragDrop. Pada target penurunan, Anda dapat menentukan efek yang diharapkan oleh target dalam properti Effects kelas DragEventArgs. Saat target drop menentukan efek yang dimaksudkan dalam peristiwa DragOver, informasi tersebut diteruskan kembali ke sumber drag dalam peristiwa GiveFeedback. Sumber seret menggunakan informasi ini untuk memberitahukan pengguna tentang efek yang akan dilakukan oleh target penurunan terhadap data. Saat data dihilangkan, target penurunan menentukan efek aktualnya dalam peristiwa Drop. Informasi tersebut diteruskan kembali ke sumber seret sebagai nilai pengembalian metode DoDragDrop. Jika target penurunan mengembalikan efek yang tidak ada dalam daftar sumber seret allowedEffects, operasi seret dan letakkan dibatalkan tanpa terjadi transfer data.

Penting untuk diingat bahwa dalam WPF, nilai DragDropEffects hanya digunakan untuk menyediakan komunikasi antara sumber drag dan target drop mengenai efek dari operasi tarik dan lepas. Efek aktual dari operasi seret dan letakkan tergantung pada Anda untuk menulis kode yang sesuai di aplikasi Anda.

Misalnya, target penjatuhan mungkin menentukan bahwa efek menjatuhkan data padanya adalah memindahkan data. Namun, untuk memindahkan data, data harus ditambahkan ke elemen target dan dihapus dari elemen sumber. Elemen sumber mungkin menunjukkan bahwa elemen tersebut memungkinkan pemindahan data, tetapi jika Anda tidak menyediakan kode untuk menghapus data dari elemen sumber, hasil akhirnya adalah bahwa data disalin, dan tidak dipindahkan.

Peristiwa Seret dan Letakkan

Operasi seret dan letakkan mendukung model berbasis peristiwa. Sumber tarik dan target lepas menggunakan sekumpulan peristiwa standar untuk menangani operasi tarik dan lepas. Tabel berikut ini meringkas peristiwa drag-and-drop standar. Berikut adalah peristiwa yang dilampirkan pada kelas DragDrop. Untuk informasi selengkapnya tentang peristiwa terlampir, lihat Gambaran Umum Peristiwa Terlampir .

Seret Peristiwa Sumber

Peristiwa Ringkasan
GiveFeedback Peristiwa ini terjadi terus menerus selama operasi seret dan letakkan, dan memungkinkan sumber seret untuk memberikan informasi umpan balik kepada pengguna. Umpan balik ini umumnya diberikan dengan mengubah tampilan penunjuk mouse untuk menunjukkan efek yang diizinkan oleh target penurunan. Ini adalah acara yang seru.
QueryContinueDrag Kejadian ini terjadi ketika ada perubahan pada status tombol keyboard atau mouse selama operasi seret dan lepas, dan memungkinkan sumber drop untuk membatalkan operasi seret dan lepas tergantung pada status tombol. Ini adalah acara yang seru.
PreviewGiveFeedback Versi terowongan GiveFeedback.
PreviewQueryContinueDrag Versi terowongan QueryContinueDrag.

Hilangkan Peristiwa Target

Peristiwa Ringkasan
DragEnter Peristiwa ini terjadi ketika objek diseret ke batas target drop. Ini adalah acara yang seru.
DragLeave Peristiwa ini terjadi ketika objek diseret keluar dari batas target drop. Ini adalah acara yang seru.
DragOver Peristiwa ini terjadi terus menerus saat objek diseret (dipindahkan) dalam batas target penurunan. Ini adalah acara yang seru.
Drop Kejadian ini terjadi ketika objek dijatuhkan pada sasaran letak. Ini adalah acara yang seru.
PreviewDragEnter Versi terowongan DragEnter.
PreviewDragLeave Versi terowongan DragLeave.
PreviewDragOver Versi terowongan DragOver.
PreviewDrop Versi terowongan Drop.

Untuk menangani kejadian seret dan lepas untuk instans objek, tambahkan pengendali untuk kejadian yang tercantum dalam tabel sebelumnya. Untuk menangani peristiwa seret dan letakkan di tingkat kelas, ambil alih metode On*Event dan On*PreviewEvent virtual yang sesuai.

Menerapkan Seret dan Lepas

Elemen UI dapat berupa sumber seret, target penurunan, atau keduanya. Untuk menerapkan tarik dan jatuhkan dasar, Anda menulis kode untuk memulai operasi tarik dan jatuhkan dan untuk memproses data yang dijatuhkan. Anda dapat meningkatkan pengalaman seret dan letakkan dengan menangani acara seret dan letakkan yang bersifat opsional.

Untuk menerapkan dasar-dasar seret dan lepas, Anda akan menyelesaikan tugas berikutnya:

  • Identifikasi elemen yang akan menjadi sumber seret. Sumber seret dapat berupa UIElement atau ContentElement.

  • Buat penanganan aktivitas pada sumber seret yang akan memulai operasi seret dan letakkan. Peristiwa ini biasanya merupakan peristiwa MouseMove.

  • Di penanganan aktivitas sumber seret, panggil metode DoDragDrop untuk memulai operasi seret dan letakkan. Dalam panggilan DoDragDrop, tentukan sumber seret, data yang akan ditransfer, dan efek yang diizinkan.

  • Identifikasi elemen yang akan menjadi target penurunan. Target penurunan bisa UIElement atau ContentElement.

  • Pada target drop, atur properti AllowDrop ke true.

  • Di target penghilangan, buat penanganan aktivitas Drop untuk memproses data yang dihilangkan.

  • Di penanganan aktivitas Drop, ekstrak data dari DragEventArgs dengan menggunakan metode GetDataPresent dan GetData.

  • Di pengendali acara Drop, gunakan data untuk melakukan operasi drag-and-drop yang diinginkan.

Anda dapat meningkatkan implementasi seret dan letakkan dengan membuat DataObject kustom dan dengan menangani peristiwa sumber seret dan jatuhkan target opsional, seperti yang ditunjukkan dalam tugas berikut:

  • Untuk mentransfer data kustom atau beberapa item data, buat DataObject untuk diteruskan ke metode DoDragDrop.

  • Untuk melakukan tindakan tambahan selama drag, tangani peristiwa DragEnter, DragOver, dan DragLeave pada sasaran letak.

  • Untuk mengubah tampilan penunjuk mouse, tangani peristiwa GiveFeedback pada sumber seret.

  • Untuk mengubah cara operasi seret dan letakkan dibatalkan, tangani peristiwa QueryContinueDrag di sumber seret dan letakkan.

Contoh Seret dan Letakkan

Bagian ini menjelaskan cara menerapkan seret dan lepas untuk elemen Ellipse tersebut. Ellipse adalah sumber seret dan target drop. Data yang ditransfer adalah representasi string dari properti Fill elips. XAML berikut memperlihatkan elemen Ellipse dan peristiwa terkait dengan seret dan jatuhkan yang ditanganinya. Untuk langkah-langkah lengkap tentang cara menerapkan seret dan lepas, lihat panduan : Mengaktifkan Seret dan Lepas pada Kontrol Pengguna.

<Ellipse Height="50" Width="50" Fill="Green"
     MouseMove="ellipse_MouseMove"
     GiveFeedback="ellipse_GiveFeedback"
     AllowDrop="True"
     DragEnter="ellipse_DragEnter" DragLeave="ellipse_DragLeave"
     DragOver="ellipse_DragOver" Drop="ellipse_Drop" />

Mengaktifkan Elemen sebagai Sumber Seret

Objek yang merupakan sumber seret bertanggung jawab untuk:

  • Mengidentifikasi saat tarikan terjadi.

  • Memulai operasi seret dan letakkan.

  • Mengidentifikasi data yang akan ditransfer.

  • Menentukan efek dari operasi seret dan lepas terhadap data yang ditransfer yang diperbolehkan.

Sumber seret dapat memberikan umpan balik kepada pengguna mengenai tindakan yang diizinkan (memindahkan, menyalin, tidak ada), dan juga dapat membatalkan operasi seret dan letakkan berdasarkan input pengguna tambahan, seperti menekan tombol ESC selama proses seret.

Aplikasi Anda bertanggung jawab untuk menentukan kapan drag terjadi, lalu memulai operasi drag-and-drop dengan memanggil metode DoDragDrop. Biasanya, ini adalah ketika peristiwa MouseMove terjadi di atas elemen yang akan diseret saat tombol mouse ditekan. Contoh berikut menunjukkan cara memulai operasi seret dan lepas dari penanganan acara MouseMove elemen Ellipse untuk menjadikannya sumber tarikan. Data yang ditransfer adalah representasi string dari properti Fill elips.

private void ellipse_MouseMove(object sender, MouseEventArgs e)
{
    Ellipse ellipse = sender as Ellipse;
    if (ellipse != null && e.LeftButton == MouseButtonState.Pressed)
    {
        DragDrop.DoDragDrop( ellipse,
                             ellipse.Fill.ToString(),
                             DragDropEffects.Copy);
    }
}
Private Sub Ellipse_MouseMove(ByVal sender As System.Object, ByVal e As System.Windows.Input.MouseEventArgs)
    Dim ellipse = TryCast(sender, Ellipse)
    If ellipse IsNot Nothing AndAlso e.LeftButton = MouseButtonState.Pressed Then
        DragDrop.DoDragDrop(ellipse, ellipse.Fill.ToString(), DragDropEffects.Copy)
    End If
End Sub

Di dalam penanganan aktivitas MouseMove, panggil metode DoDragDrop untuk memulai operasi seret dan letakkan. Metode DoDragDrop mengambil tiga parameter:

  • dragSource – Referensi ke objek dependensi yang merupakan sumber data yang ditransfer; ini biasanya merupakan sumber peristiwa MouseMove.

  • data - Objek yang berisi data yang ditransfer, dibungkus dalam DataObject.

  • allowedEffects - Salah satu nilai enumerasi DragDropEffects yang menentukan efek yang diizinkan dari operasi geser dan lepaskan.

Setiap objek yang dapat diserialisasikan dapat diteruskan dalam parameter data. Jika data belum dibungkus dalam DataObject, data akan secara otomatis dibungkus dalam DataObjectbaru. Untuk meneruskan beberapa item data, Anda harus membuat DataObject secara manual, dan meneruskannya ke metode DoDragDrop. Untuk informasi selengkapnya, lihat Data dan Objek Data.

Parameter allowedEffects digunakan untuk menentukan apa yang akan diizinkan oleh sumber seret agar target jatuh dapat dilakukan dengan data yang ditransfer. Nilai umum untuk sumber seret adalah Copy, Move, dan All.

Nota

Target penurunan juga dapat menentukan efek apa yang ingin ditanggapi terhadap data yang dihilangkan. Misalnya, jika target seret tidak mengenali jenis data yang akan dijatuhkan, ia dapat menolak data tersebut dengan mengatur efek yang diizinkan menjadi None. Ini biasanya melakukan ini di penanganan peristiwa DragOver.

Sumber seret dapat secara opsional menangani peristiwa GiveFeedback dan QueryContinueDrag. Peristiwa ini memiliki handler default yang digunakan kecuali Anda menetapkan peristiwa sebagai telah ditangani. Anda biasanya akan mengabaikan peristiwa ini kecuali Anda memiliki kebutuhan khusus untuk mengubah perilaku defaultnya.

Peristiwa GiveFeedback dipicu secara terus-menerus saat sumber seret sedang aktif. Handler bawaan untuk peristiwa ini memeriksa apakah sumber seret berada di atas target drop yang valid. Jika ya, itu memeriksa efek yang diizinkan dari target penurunan. Kemudian memberikan umpan balik kepada pengguna akhir mengenai efek penurunan yang diizinkan. Ini biasanya dilakukan dengan mengubah kursor mouse menjadi kursor larangan menjatuhkan, salin, atau pindahkan. Anda hanya boleh menangani peristiwa ini jika Anda perlu menggunakan kursor kustom untuk memberikan umpan balik kepada pengguna. Jika Anda menangani kejadian ini, pastikan untuk menandainya sebagai ditangani sehingga handler default tidak mengambil alih handler Anda.

Peristiwa QueryContinueDrag dipicu secara terus-menerus saat sumber seret sedang aktif. Anda dapat mengelola peristiwa ini untuk menentukan tindakan yang mengakhiri operasi seret dan letakkan berdasarkan keadaan tombol ESC, SHIFT, CTRL, dan ALT, serta keadaan tombol mouse. Handler bawaan untuk peristiwa ini membatalkan operasi seret dan letakkan jika tombol ESC ditekan, dan melepaskan data jika tombol mouse dilepaskan.

Perhatian

Peristiwa ini dipicu terus menerus selama operasi seret dan letakkan. Oleh karena itu, Anda harus menghindari tugas intensif sumber daya di penanganan aktivitas. Misalnya, gunakan kursor cache alih-alih membuat kursor baru setiap kali peristiwa GiveFeedback dinaikkan.

Mengaktifkan Elemen Menjadi Sasaran Penjatuhan

Objek yang merupakan target penempatan bertanggung jawab untuk:

  • Menentukan bahwa itu adalah sasaran penempatan yang valid.

  • Merespons sumber seret saat menyeret ke target.

  • Memeriksa apakah data yang ditransfer dalam format yang dapat diterimanya.

  • Memproses data yang dihilangkan.

Untuk menentukan bahwa elemen adalah target penurunan, Anda mengatur properti AllowDrop ke true. Peristiwa target drop kemudian akan dinaikkan pada elemen sehingga Anda dapat menanganinya.

Saat target penurunan dievaluasi, pengujian hit dilakukan untuk mengidentifikasi apakah kursor melebihi visual elemen. Beberapa kontrol, seperti Canvas, tidak memiliki visual dan tidak dapat digunakan sebagai sasaran peletakan kecuali visual ditambahkan. Atur properti Canvas.Background ke warna apa pun untuk membuat visual yang mengisi Canvas dengan warna. Untuk menjaga Canvas tetap transparan tetapi mengaktifkannya sebagai target drop, atur properti Background ke Transparent.

Selama operasi seret dan letakkan, urutan peristiwa berikut terjadi pada sasaran penempatan.

  1. DragEnter

  2. DragOver

  3. DragLeave atau Drop

Peristiwa DragEnter terjadi saat data diseret ke batas sasaran penurunan. Anda biasanya menangani peristiwa ini untuk memberikan pratinjau efek dari operasi seret dan letakkan, jika sesuai dengan aplikasi Anda. Jangan mengatur properti DragEventArgs.Effects pada peristiwa DragEnter, karena akan ditimpa pada peristiwa DragOver.

Contoh berikut menunjukkan penanganan aktivitas DragEnter untuk elemen Ellipse. Kode ini mempratinjau efek operasi seret dan letakkan dengan menyimpan kuas Fill yang sedang digunakan. Kemudian menggunakan metode GetDataPresent untuk memeriksa apakah DataObject yang diseret melalui elips berisi data string yang dapat dikonversi ke Brush. Jika demikian, data diekstrak menggunakan metode GetData. Kemudian dikonversi ke Brush dan diterapkan ke elips. Perubahan dibalikkan dalam penanganan event DragLeave. Jika data tidak dapat dikonversi ke Brush, tidak ada tindakan yang dilakukan.

private Brush _previousFill = null;
private void ellipse_DragEnter(object sender, DragEventArgs e)
{
    Ellipse ellipse = sender as Ellipse;
    if (ellipse != null)
    {
        // Save the current Fill brush so that you can revert back to this value in DragLeave.
        _previousFill = ellipse.Fill;

        // If the DataObject contains string data, extract it.
        if (e.Data.GetDataPresent(DataFormats.StringFormat))
        {
            string dataString = (string)e.Data.GetData(DataFormats.StringFormat);

            // If the string can be converted into a Brush, convert it.
            BrushConverter converter = new BrushConverter();
            if (converter.IsValid(dataString))
            {
                Brush newFill = (Brush)converter.ConvertFromString(dataString);
                ellipse.Fill = newFill;
            }
        }
    }
}
Private _previousFill As Brush = Nothing
Private Sub Ellipse_DragEnter(ByVal sender As System.Object, ByVal e As System.Windows.DragEventArgs)
    Dim ellipse = TryCast(sender, Ellipse)
    If ellipse IsNot Nothing Then
        ' Save the current Fill brush so that you can revert back to this value in DragLeave.
        _previousFill = ellipse.Fill

        ' If the DataObject contains string data, extract it.
        If e.Data.GetDataPresent(DataFormats.StringFormat) Then
            Dim dataString = e.Data.GetData(DataFormats.StringFormat)

            ' If the string can be converted into a Brush, convert it.
            Dim converter As New BrushConverter()
            If converter.IsValid(dataString) Then
                Dim newFill As Brush = CType(converter.ConvertFromString(dataString), Brush)
                ellipse.Fill = newFill
            End If
        End If
    End If
End Sub

Peristiwa DragOver terjadi terus menerus saat data diseret ke target penurunan. Kejadian ini dipasangkan dengan peristiwa GiveFeedback pada sumber seret. Di penanganan peristiwa DragOver, Anda biasanya menggunakan metode GetDataPresent dan GetData untuk memeriksa apakah data yang ditransfer dalam format yang dapat diproses target drop. Anda juga dapat memeriksa apakah ada tombol pengubah yang ditekan, yang biasanya akan menunjukkan apakah pengguna berniat memindahkan atau menyalin tindakan. Setelah pemeriksaan ini dilakukan, Anda mengatur properti DragEventArgs.Effects untuk memberi tahu sumber seret tentang efek yang akan terjadi ketika data dijatuhkan. Sumber drag menerima informasi ini di argumen acara GiveFeedback, dan dapat mengatur kursor yang sesuai untuk memberikan umpan balik kepada pengguna.

Contoh berikut menunjukkan penanganan aktivitas DragOver untuk elemen Ellipse. Kode ini memeriksa untuk melihat apakah DataObject yang diseret melalui elips berisi data string yang dapat dikonversi ke Brush. Jika demikian, ia mengatur properti DragEventArgs.Effects ke Copy. Ini memberitahu sumber seret bahwa data dapat disalin ke elips. Jika data tidak dapat dikonversi ke Brush, properti DragEventArgs.Effects diatur ke None. Ini menunjukkan ke sumber seret bahwa elips bukan target penurunan yang valid untuk data.

private void ellipse_DragOver(object sender, DragEventArgs e)
{
    e.Effects = DragDropEffects.None;

    // If the DataObject contains string data, extract it.
    if (e.Data.GetDataPresent(DataFormats.StringFormat))
    {
        string dataString = (string)e.Data.GetData(DataFormats.StringFormat);

        // If the string can be converted into a Brush, allow copying.
        BrushConverter converter = new BrushConverter();
        if (converter.IsValid(dataString))
        {
            e.Effects = DragDropEffects.Copy | DragDropEffects.Move;
        }
    }
}
Private Sub Ellipse_DragOver(ByVal sender As System.Object, ByVal e As System.Windows.DragEventArgs)
    e.Effects = DragDropEffects.None

    ' If the DataObject contains string data, extract it.
    If e.Data.GetDataPresent(DataFormats.StringFormat) Then
        Dim dataString = e.Data.GetData(DataFormats.StringFormat)

        ' If the string can be converted into a Brush, convert it.
        Dim converter As New BrushConverter()
        If converter.IsValid(dataString) Then
            e.Effects = DragDropEffects.Copy Or DragDropEffects.Move
        End If
    End If
End Sub

Peristiwa DragLeave terjadi saat data diseret keluar dari batas target tanpa dihilangkan. Anda menangani peristiwa ini untuk membatalkan apa pun yang Anda lakukan di pengendali peristiwa DragEnter.

Contoh berikut menunjukkan penanganan aktivitas DragLeave untuk elemen Ellipse. Kode ini membatalkan pratinjau yang dilakukan di event handler DragEnter dengan menggunakan Brush yang telah disimpan pada elips.

private void ellipse_DragLeave(object sender, DragEventArgs e)
{
    Ellipse ellipse = sender as Ellipse;
    if (ellipse != null)
    {
        ellipse.Fill = _previousFill;
    }
}
Private Sub Ellipse_DragLeave(ByVal sender As System.Object, ByVal e As System.Windows.DragEventArgs)
    Dim ellipse = TryCast(sender, Ellipse)
    If ellipse IsNot Nothing Then
        ellipse.Fill = _previousFill
    End If
End Sub

Peristiwa Drop terjadi ketika data dijatuhkan pada sasaran jatuhan; secara bawaan, ini terjadi ketika tombol mouse dilepaskan. Di penanganan aktivitas Drop, Anda menggunakan metode GetData untuk mengekstrak data yang ditransfer dari DataObject dan melakukan pemrosesan data apa pun yang diperlukan aplikasi Anda. Peristiwa Drop mengakhiri operasi seret dan lepas.

Contoh berikut menunjukkan penanganan aktivitas Drop untuk elemen Ellipse. Kode ini menerapkan efek dari operasi seret dan lepas, dan mirip dengan kode dalam penangan kejadian DragEnter. Ini memeriksa untuk melihat apakah DataObject yang diseret melalui elips berisi data string yang dapat dikonversi ke Brush. Jika demikian, Brush diterapkan ke elips. Jika data tidak dapat dikonversi ke Brush, tidak ada tindakan yang dilakukan.

private void ellipse_Drop(object sender, DragEventArgs e)
{
    Ellipse ellipse = sender as Ellipse;
    if (ellipse != null)
    {
        // If the DataObject contains string data, extract it.
        if (e.Data.GetDataPresent(DataFormats.StringFormat))
        {
            string dataString = (string)e.Data.GetData(DataFormats.StringFormat);

            // If the string can be converted into a Brush,
            // convert it and apply it to the ellipse.
            BrushConverter converter = new BrushConverter();
            if (converter.IsValid(dataString))
            {
                Brush newFill = (Brush)converter.ConvertFromString(dataString);
                ellipse.Fill = newFill;
            }
        }
    }
}
Private Sub Ellipse_Drop(ByVal sender As System.Object, ByVal e As System.Windows.DragEventArgs)
    Dim ellipse = TryCast(sender, Ellipse)
    If ellipse IsNot Nothing Then

        ' If the DataObject contains string data, extract it.
        If e.Data.GetDataPresent(DataFormats.StringFormat) Then
            Dim dataString = e.Data.GetData(DataFormats.StringFormat)

            ' If the string can be converted into a Brush, convert it.
            Dim converter As New BrushConverter()
            If converter.IsValid(dataString) Then
                Dim newFill As Brush = CType(converter.ConvertFromString(dataString), Brush)
                ellipse.Fill = newFill
            End If
        End If
    End If
End Sub

Lihat juga