ฉันเคยเห็นสิ่งนี้ทำในสภาพแวดล้อมTurbo C ++ของ Borland แต่ฉันไม่แน่ใจว่าจะทำอย่างไรกับแอปพลิเคชัน C # ที่ฉันกำลังทำงาน มีวิธีปฏิบัติที่ดีที่สุดหรือ gotchas ระวังหรือไม่
ฉันเคยเห็นสิ่งนี้ทำในสภาพแวดล้อมTurbo C ++ของ Borland แต่ฉันไม่แน่ใจว่าจะทำอย่างไรกับแอปพลิเคชัน C # ที่ฉันกำลังทำงาน มีวิธีปฏิบัติที่ดีที่สุดหรือ gotchas ระวังหรือไม่
คำตอบ:
โค้ดตัวอย่างบางส่วน:
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[])
ที่ปลอดภัยสำหรับการใด ๆ หล่อFileDrop
ลดลง -formatted? นั่นคือมันเป็นไปได้ไหมที่จะสร้างสิ่งFileDrop
ที่จะทำให้เกิดข้อยกเว้นที่ผิดกฎหมายstring[]
? ฉันมีปัญหาในการหาว่าจากเอกสาร
ระวังสิทธิความปลอดภัยของ windows vista / windows 7 - หากคุณใช้งาน Visual Studio ในฐานะผู้ดูแลระบบคุณจะไม่สามารถลากไฟล์จากหน้าต่าง explorer ที่ไม่ใช่ผู้ดูแลระบบไปยังโปรแกรมของคุณเมื่อคุณเรียกใช้จากภายใน visual studio กิจกรรมที่เกี่ยวข้องกับการลากจะไม่เริ่มทำงาน! ฉันหวังว่านี่จะช่วยให้คนอื่นไม่ต้องเสียเวลากับชีวิตของพวกเขา ...
ใน Windows Forms ตั้งค่าคุณสมบัติ AllowDrop ของตัวควบคุมจากนั้นฟังเหตุการณ์ DragEnter และเหตุการณ์ DragDrop
เมื่อDragEnter
เหตุการณ์เกิดขึ้นให้ตั้งค่าอาร์กิวเมนต์เป็นAllowedEffect
สิ่งอื่นที่ไม่ใช่ (เช่นe.Effect = DragDropEffects.Move
)
เมื่อDragDrop
เหตุการณ์เริ่มขึ้นคุณจะได้รับรายการสตริง แต่ละสตริงคือพา ธ แบบเต็มไปยังไฟล์ที่กำลังถูกดร็อป
คุณต้องระวัง gotcha คลาสใด ๆ ที่คุณผ่านเป็นDataObjectในการดำเนินการลาก / ปล่อยจะต้องเป็น Serializable ดังนั้นหากคุณลองและส่งผ่านวัตถุและมันไม่ทำงานตรวจสอบให้แน่ใจว่ามันสามารถต่อเนื่องได้เนื่องจากมันเกือบจะเป็นปัญหาแน่นอน นี่ทำให้ฉันออกไปสองสามครั้ง!
ยังอีก gotcha:
รหัสเฟรมเวิร์กที่เรียกใช้ Drag-events กลืนข้อยกเว้นทั้งหมด คุณอาจคิดว่ารหัสเหตุการณ์ของคุณทำงานได้อย่างราบรื่นในขณะที่มันกำลังไหลออกข้อยกเว้นไปทั่ว คุณมองไม่เห็นเพราะเฟรมเวิร์กขโมยไป
นั่นเป็นเหตุผลที่ฉันมักจะลอง / จับในตัวจัดการเหตุการณ์เหล่านี้เสมอเพื่อให้ฉันรู้ว่าพวกเขาโยนข้อยกเว้นใด ๆ ฉันมักจะใส่ Debugger.Break (); ในส่วนที่จับ
ก่อนการเปิดตัวหลังจากการทดสอบถ้าทุกอย่างดูเหมือนว่าจะทำงานฉันจะลบหรือแทนที่สิ่งเหล่านี้ด้วยการจัดการข้อยกเว้นจริง
Gotcha ทั่วไปอีกอย่างหนึ่งกำลังคิดว่าคุณสามารถละเว้นเหตุการณ์ในแบบฟอร์ม DragOver (หรือ DragEnter) ฉันมักจะใช้เหตุการณ์ DragOver ของฟอร์มเพื่อตั้งค่า AllowedEffect จากนั้นเป็นเหตุการณ์ DragDrop ของตัวควบคุมที่เฉพาะเจาะจงเพื่อจัดการข้อมูลที่ลดลง
นี่คือสิ่งที่ฉันใช้ในการวางไฟล์และ / หรือโฟลเดอร์ที่เต็มไปด้วยไฟล์ ในกรณีของฉันฉันกรอง*.dwg
เฉพาะไฟล์และเลือกที่จะรวมโฟลเดอร์ย่อยทั้งหมด
fileList
เป็นIEnumerable
หรือคล้ายกันในกรณีของฉันถูกผูกไว้กับการควบคุม WPF ...
var fileList = (IList)FileList.ItemsSource;
ดูhttps://stackoverflow.com/a/19954958/492สำหรับรายละเอียดของเคล็ดลับนั้น
ตัวจัดการการตก ...
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);
}
}
คุณสามารถใช้การลาก & วางใน WinForms และ WPF
คุณควรเพิ่มเหตุการณ์ mousemove:
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:
โมฆะส่วนตัว YourElementControl_DragDrop (ผู้ส่งวัตถุ DragEventArgs e)
{
...
foreach (string path in (string[])e.Data.GetData(DataFormats.FileDrop))
{
File.Copy(path, DirPath + Path.GetFileName(path));
}
...
}