Bunun Borland'ın Turbo C ++ ortamında yapıldığını gördüm , ancak üzerinde çalıştığım bir C # uygulaması için nasıl devam edeceğimi bilmiyorum. Dikkat edilmesi gereken en iyi uygulamalar veya gotcha'lar var mı?
Bunun Borland'ın Turbo C ++ ortamında yapıldığını gördüm , ancak üzerinde çalıştığım bir C # uygulaması için nasıl devam edeceğimi bilmiyorum. Dikkat edilmesi gereken en iyi uygulamalar veya gotcha'lar var mı?
Yanıtlar:
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);
}
}
io.File
(string[])
herhangi dökme güvenli FileDrop
-dosyaları biçimlendirilmiş damla? Yani, FileDrop
yasadışı bir oyuncu istisnasına neden olacak bir tane oluşturmak mümkün string[]
mü? Bunu dokümanlardan anlamakta zorlanıyorum .
Windows Vista / Windows 7 güvenlik haklarına dikkat edin - Visual Studio'yu yönetici olarak çalıştırıyorsanız, Visual Studio içinden çalıştırdığınızda dosyaları yönetici olmayan bir gezgin penceresinden programınıza sürükleyemezsiniz. Sürükle ile ilgili olaylar bile ateş etmeyecek! Umarım bu, başka birisinin hayatlarının saatlerini boşa harcamamasına yardımcı olur ...
Windows Forms'da denetimin AllowDrop özelliğini ayarlayın, ardından DragEnter olayını ve DragDrop olayını dinleyin.
Ne zaman DragEnter
olay patlar set argüman var AllowedEffect
hiçbiri (örneğin dışında bir e.Effect = DragDropEffects.Move
).
DragDrop
Etkinlik başladığında dizelerin bir listesini alırsınız. Her dize, bırakılan dosyanın tam yoludur.
Bir gotcha'nın farkında olmanız gerekir. Sürükle / bırak işleminde DataObject olarak ilettiğiniz herhangi bir sınıfın Serializable olması gerekir. Bu nedenle, bir nesneyi geçmeye çalışırsanız ve çalışmazsa, bunun kesinlikle sorun olduğu için serileştirilebildiğinden emin olun. Bu beni birkaç kez yakaladı!
Yine başka bir yakaladım:
Drag olaylarını çağıran çerçeve kodu tüm istisnaları yutar. Etkinlik kodunuzun her yerde istisnalar yaparken sorunsuz çalıştığını düşünebilirsiniz. Onları göremezsiniz çünkü çerçeve onları çalar.
Bu yüzden bu olay işleyicilerine her zaman bir deneme / yakalama koydum, sadece herhangi bir istisna atıp atmadıklarını biliyorum. Genellikle bir Debugger.Break (); yakalama kısmında.
Serbest bırakmadan önce, testten sonra, her şey davranıyor gibi görünüyorsa, bunları gerçek istisna işleme ile kaldırırım veya değiştiririm.
Bir diğer yaygın sorcha, Form DragOver (veya DragEnter) olaylarını göz ardı edebileceğinizi düşünüyor. Genellikle Form'un DragOver olayını AllowEffect ayarlamak ve sonra belirli bir denetimin DragDrop olay bırakılan verileri işlemek için kullanın.
İşte dosya ve / veya dosya dolu klasörleri bırakmak için kullandığım bir şey. Benim durumumda *.dwg
sadece dosyaları filtreliyordum ve tüm alt klasörleri dahil etmeyi seçtim.
fileList
Bir olan IEnumerable
ya da benim durumda benzer bir WPF denetime bağlı ...
var fileList = (IList)FileList.ItemsSource;
Bu hile ile ilgili ayrıntılar için bkz. Https://stackoverflow.com/a/19954958/492 .
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);
}
}
Sürükle ve Bırak özelliğini WinForms ve WPF'de uygulayabilirsiniz.
Mousemove olayı eklemelisiniz:
private void YourElementControl_MouseMove(object sender, MouseEventArgs e)
{
...
if (e.Button == MouseButtons.Left)
{
DoDragDrop(new DataObject(DataFormats.FileDrop, new string[] { PathToFirstFile,PathToTheNextOne }), DragDropEffects.Move);
}
...
}
DragDrop olayını eklemelisiniz:
private void YourElementControl_DragDrop (nesne gönderen, DragEventArgs e)
{
...
foreach (string path in (string[])e.Data.GetData(DataFormats.FileDrop))
{
File.Copy(path, DirPath + Path.GetFileName(path));
}
...
}