Seret dan lepas file ke WPF

106

Saya perlu memasukkan file gambar ke dalam aplikasi WPF saya. Saat ini saya memiliki peristiwa yang diaktifkan ketika saya memasukkan file, tetapi saya tidak tahu apa yang harus dilakukan selanjutnya. Bagaimana cara mendapatkan Gambar? Apakah senderobjek itu gambar atau kontrolnya?

private void ImagePanel_Drop(object sender, DragEventArgs e)
{
    //what next, dont know how to get the image object, can I get the file path here?
}
Eamonn McEvoy
sumber

Jawaban:

211

Pada dasarnya inilah yang ingin Anda lakukan.

private void ImagePanel_Drop(object sender, DragEventArgs e)
{

  if (e.Data.GetDataPresent(DataFormats.FileDrop))
  {
    // Note that you can have more than one file.
    string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);

    // Assuming you have one file that you care about, pass it off to whatever
    // handling code you have defined.
    HandleFileOpen(files[0]);
  }
}

Juga, jangan lupa untuk benar-benar menghubungkan acara di XAML, serta menyetel AllowDropatributnya.

<StackPanel Name="ImagePanel" Drop="ImagePanel_Drop" AllowDrop="true">
    ...
</StackPanel>
AR
sumber
mengagumkan bekerja pesona, hanya menukar "HandleFileOpen (files [0]);" ke "foreach (string file dalam file) {Openfile (file);}" - Terima kasih :)
Eamonn McEvoy
1
Maaf :) Maksud saya drag & drop tidak berfungsi. AllowDropdisetel ke True tetapi Droppenangan kejadian tidak pernah dipanggil. Ketika saya menyeret file ke atas jendela, saya melihat simbol melingkar "ditolak"
mcont
4
Saya menggunakan Gridelemen root, dengan bagian Borderdalam dengan Backgroundproperti diatur ke sesuatu (putih baik-baik saja, tetapi tidak transparan). Di dalam Bordersaya meletakkan konten yang sebenarnya.
mcont
1
Mengatur latar belakang menjadi transparan berfungsi dengan baik bagi saya ketika mencoba untuk jatuh ke Grid. Rupanya Anda membutuhkan latar belakang agar tes hit terjadi. Berkat entri blog ini: codeinreview.com/136/enabling-drag-and-drop-over-a-grid-in-wpf
DustinA
1
Salah satu Gotcha sebenarnya adalah jika Anda menjalankan VisualStudio sebagai Admin - men-debug aplikasi Anda - dan menyeret dari FileExplorer sebagai non admin, konteks keamanannya berbeda dan tidak ada peristiwa seret yang akan dipicu. Membebani saya 30 menit hidup.
Hans Karlsen
35

File gambar terdapat dalam eparameter, yang merupakan turunan dari DragEventArgskelas .
( senderParameter berisi referensi ke objek yang memunculkan peristiwa tersebut.)

Secara khusus, periksa e.Dataanggota ; seperti yang dijelaskan dalam dokumentasi, ini mengembalikan referensi ke objek data ( IDataObject) yang berisi data dari peristiwa tarik.

The IDataObjectinterface memberikan sejumlah metode untuk mengambil data objek yang Anda setelah. Anda mungkin ingin memulai dengan memanggil GetFormatsmetode untuk mengetahui format data yang Anda kerjakan. (Misalnya, apakah itu gambar aktual atau sekadar jalur ke file gambar?)

Kemudian, setelah Anda mengidentifikasi format file yang sedang diseret, Anda akan memanggil salah satu kelebihan tertentu dari GetDatametode tersebut untuk benar-benar mengambil objek data dalam format tertentu.

Cody Grey
sumber
12

Selain itu untuk menjawab AR perlu diketahui bahwa jika Anda ingin menggunakan TextBoxdrop Anda harus mengetahui hal-hal berikut.

TextBoxtampaknya sudah memiliki beberapa penanganan default untuk DragAndDrop. Jika objek data Anda adalah a String, itu akan berfungsi. Jenis lain tidak ditangani dan Anda mendapatkan efek mouse Terlarang dan penangan Drop Anda tidak pernah dipanggil.

Sepertinya Anda dapat mengaktifkan penanganan Anda sendiri dengan e.Handledto true di PreviewDragOverpengendali kejadian.

XAML

<TextBox AllowDrop="True"    x:Name="RtbInputFile"      HorizontalAlignment="Stretch"   HorizontalScrollBarVisibility="Visible"  VerticalScrollBarVisibility="Visible" />

C #

RtbInputFile.Drop += RtbInputFile_Drop;            
RtbInputFile.PreviewDragOver += RtbInputFile_PreviewDragOver;

private void RtbInputFile_PreviewDragOver(object sender, DragEventArgs e)
{
    e.Handled = true;
}

private void RtbInputFile_Drop(object sender, DragEventArgs e)
{
     if (e.Data.GetDataPresent(DataFormats.FileDrop))
     {
                // Note that you can have more than one file.
                string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
                var file = files[0];                
                HandleFile(file);  
     }
}
Pengembang
sumber
1
Contoh AR melewatkan handler PreviewDragOver, yang cukup penting untuk menyatukan semuanya. Pujian.
Greg Vogel