Dosyaları WPF'ye sürükleyip bırakın


107

WPF uygulamama bir resim dosyası bırakmam gerekiyor. Şu anda dosyaları bıraktığımda tetiklenen bir olayım var, ancak daha sonra ne yapacağımı bilmiyorum. Görüntüyü nasıl elde ederim? Mı sendernesne görüntü veya kontrol?

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

Yanıtlar:


212

Temelde yapmak istediğiniz şey bu.

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

Ayrıca, olayı XAML'de bağlamayı ve AllowDropözniteliği ayarlamayı da unutmayın .

<StackPanel Name="ImagePanel" Drop="ImagePanel_Drop" AllowDrop="true">
    ...
</StackPanel>

müthiş bir cazibe sağlar, sadece "HandleFileOpen (files [0])" değiştirildi; "foreach (dosyalardaki dize dosyası) {Openfile (dosya);}" - Teşekkürler :)
Eamonn McEvoy

1
Üzgünüm :) Sürükle ve bırak çalışmıyor demek istiyorum. AllowDropTrue olarak ayarlanır, ancak Dropolay işleyici hiçbir zaman çağrılmaz. Bir dosyayı pencerenin üzerine sürüklediğimde, "reddedildi" şeklinde bir dairesel sembol
görüyorum

4
Ben kullanılan Gridbir ile, kök eleman olarak Borderiçte Background(beyaz iyi, ama şeffaf değildir) bir şeye özellik seti. İçine Borderasıl içeriği koydum.
mcont

1
Arka planı şeffaf olarak ayarlamak, bir Grid'e düşürmeye çalışırken benim için iyi çalıştı. Görünüşe göre bir geçmişe ihtiyacın var, böylece vuruş testi gerçekleşir. Bu blog girişi sayesinde: codeinreview.com/136/entive-drag-and-drop-over-a-grid-in-wpf
DustinA

1
Gerçek bir Gotcha, VisualStudio'yu Yönetici olarak çalıştırırsanız - uygulamanızda hata ayıklama - ve FileExplorer'dan yönetici olmayan olarak sürüklerseniz, güvenlik bağlamı farklıdır ve sürükleme olayları tetiklenmez. Bana 30 dakikaya mal oldu.
Hans Karlsen

35

Görüntü dosyası, sınıfıne bir örneği olan parametrenin içinde bulunur . (DragEventArgs
sender Parametre, olayı başlatan nesneye bir başvuru içerir.)

Özellikle e.Dataüyeyi kontrol edin ; belgelerde açıklandığı gibi, bu IDataObject, drag olayından elde edilen verileri içeren veri nesnesine ( ) bir referans döndürür .

IDataObjectArayüz peşinde olduğunuz o veri nesnesini almak için çeşitli yöntemler sunar. Üzerinde çalıştığınız verilerin biçimini öğrenmek için muhtemelen GetFormatsyöntemi çağırarak başlamak isteyeceksiniz . (Örneğin, gerçek bir görüntü mü yoksa sadece bir görüntü dosyasına giden yol mu?)

Ardından, sürüklenmekte olan dosyanın biçimini belirledikten sonra GetData, veri nesnesini belirli bir biçimde gerçekten almak için yöntemin belirli aşırı yüklerinden birini çağıracaksınız .


12

AR cevabına ek olarak, bırakmak için kullanmak TextBoxistiyorsanız aşağıdaki şeyleri bilmeniz gerektiğini lütfen unutmayın .

TextBoxzaten bazı varsayılan işlemlere sahip gibi görünüyor DragAndDrop. Veri nesneniz bir ise String, basitçe çalışır. Diğer türler işlenmez ve Yasak fare efektini alırsınız ve Drop işleyiciniz asla aranmaz .

Kendi işleme etkinleştirebilirsiniz gibi görünüyor e.Handlediçin gerçek bir yer PreviewDragOverolay işleyicisi.

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

1
AR'nin örneği PreviewDragOver işleyicisini özlüyor, bu da hepsinin bir araya gelmesi için oldukça önemli. Tebrikler.
Greg Vogel
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.