it-swarm-tr.com

Dosyaları bir uygulamaya nasıl sürükleyip bırakırım?

Bunu Borland'ın Turbo C++ ortamında gördüm, ancak üzerinde çalıştığım bir C # uygulaması için nasıl devam edeceğimi bilmiyorum. Dikkat etmeniz gereken en iyi uygulamalar veya uygulamalar var mı?

225
Samuel Paul

Bazı örnek kodlar:

  public partial class Form1 : Form {
    public Form1() {
      InitializeComponent();
      this.AllowDrop = true;
      this.DragEnter += new DragEventHandler(Form1_DragEnter);
      this.DragDrop += new DragEventHandler(Form1_DragDrop);
    }

    void Form1_DragEnter(object sender, DragEventArgs e) {
      if (e.Data.GetDataPresent(DataFormats.FileDrop)) e.Effect = DragDropEffects.Copy;
    }

    void Form1_DragDrop(object sender, DragEventArgs e) {
      string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
      foreach (string file in files) Console.WriteLine(file);
    }
  }
473
Hans Passant

Windows Vista/Windows 7 güvenlik haklarının farkında olun - Visual Studio'yu yönetici olarak kullanıyorsanız, dosyaları Visual Studio'dan çalıştırırken yönetici olmayan bir Explorer penceresinden programınıza sürükleyemezsiniz. Sürükle ile ilgili olaylar bile ateşlenmeyecek! Umarım bu, başkalarının yaşamlarını boşa harcamamasına yardım eder.

127
Wayne Uroda

Windows Formlarında, denetimin AllowDrop özelliğini ayarlayın, ardından DragEnter olayını ve DragDrop olayını dinleyin.

DragEnter olayı harekete geçtiğinde, argümanın AllowedEffect değerini hiçbiri dışında bir şeye ayarlayın (örneğin e.Effect = DragDropEffects.Move).

DragDrop olayı harekete geçtiğinde, dizelerin bir listesini alırsınız. Her dize, bırakılan dosyanın tam yoludur.

40

Bir anlayacağın farkında olmalısın. Sürükle/bırak işleminde DataObject olarak geçirdiğiniz herhangi bir sınıf, Serileştirilebilir olmalıdır. Bu nedenle, bir nesneyi denemek ve geçmek ve işe yaramazsa, neredeyse kesinlikle sorun olduğu gibi seri hale getirildiğinden emin olun. Bu beni birkaç kez yakaladı!

16
Phil Wright

Yine başka bir gotcha:

Sürükle olaylarını çağıran çerçeve kodu tüm istisnaları yutar. Her yerde istisnalar fışkırırken, etkinlik kodunuzun sorunsuz çalıştığını düşünebilirsiniz. Onları göremezsiniz çünkü çerçeve onları çalıyor.

Bu nedenle, bu olay işleyicilere her zaman bir deneme/yakalama koyarım, sadece istisnalar olup olmadığını bilirim. Genelde bir Debugger.Break (); yakalamak bölümünde.

Serbest bırakmadan önce, testten sonra, her şey yolunda görünüyorsa, bunları gerçek istisna işleme ile kaldırırım veya değiştiririm.

10
Guge

İşte dosya ve/veya klasörleri dosyalarla doldurmak için kullandığım bir şey. Benim durumumda sadece *.dwg dosyalarını filtreliyordum ve tüm alt klasörleri dahil etmeyi seçtim.

fileList bir IEnumerable veya benzeridir Benim durumumda bir WPF kontrolüne bağlıydı ... 

var fileList = (IList)FileList.ItemsSource;

Bu numaraya ilişkin detaylar için https://stackoverflow.com/a/19954958/492 kısmına bakınız.

Damla İşleyici ...

  private void FileList_OnDrop(object sender, DragEventArgs e)
  {
    var dropped = ((string[])e.Data.GetData(DataFormats.FileDrop));
    var files = dropped.ToList();

    if (!files.Any())
      return;

    foreach (string drop in dropped)
      if (Directory.Exists(drop))
        files.AddRange(Directory.GetFiles(drop, "*.dwg", SearchOption.AllDirectories));

    foreach (string file in files)
    {
      if (!fileList.Contains(file) && file.ToLower().EndsWith(".dwg"))
        fileList.Add(file);
    }
  }
7
CAD bloke

Yaygın olarak kullanılan başka bir yaklaşım, DragOver Formunu (veya DragEnter) olaylarını görmezden gelebileceğinizi düşünüyor. Tipik olarak AllowEffect'i ayarlamak için Form'un DragOver olayını ve ardından bırakılan verileri işlemek için belirli bir kontrolün DragDrop olayını kullanırım.

6
Craig Eddy

Judah Himango ve Hans Passant'ın çözümü Tasarımcıda bulunmaktadır (Şu anda VS2015 kullanıyorum): enter image description here enter image description here

0
Roland