He visto esto en el entorno Turbo C ++ de Borland , pero no estoy seguro de cómo hacerlo para una aplicación C # en la que estoy trabajando. ¿Hay mejores prácticas o trampas a tener en cuenta?
He visto esto en el entorno Turbo C ++ de Borland , pero no estoy seguro de cómo hacerlo para una aplicación C # en la que estoy trabajando. ¿Hay mejores prácticas o trampas a tener en cuenta?
Respuestas:
Algún código de muestra:
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[])
seguro el yeso para cualquier FileDrop
caída con formato? Es decir, ¿es posible generar un FileDrop
que provocará una excepción de lanzamiento ilegal string[]
? Tengo problemas para descifrar eso de los documentos .
Tenga en cuenta los derechos de seguridad de Windows Vista / Windows 7: si está ejecutando Visual Studio como administrador, no podrá arrastrar archivos desde una ventana del explorador que no sea administrador a su programa cuando lo ejecute desde Visual Studio. ¡Los eventos relacionados con la resistencia ni siquiera se dispararán! Espero que esto ayude a alguien más a no perder horas de su vida ...
En Windows Forms, configure la propiedad AllowDrop del control, luego escuche el evento DragEnter y el evento DragDrop.
Cuando se DragEnter
desencadena el evento, establezca los argumentos AllowedEffect
en algo diferente a ninguno (por ejemplo e.Effect = DragDropEffects.Move
).
Cuando DragDrop
se active el evento, obtendrá una lista de cadenas. Cada cadena es la ruta completa al archivo que se descarta.
Necesitas estar al tanto de una trampa. Cualquier clase que pase como DataObject en la operación de arrastrar / soltar debe ser serializable. Entonces, si intenta pasar un objeto y no funciona, asegúrese de que se pueda serializar, ya que ese es casi seguro el problema. ¡Esto me ha pillado un par de veces!
Otro problema más:
El código marco que llama a los eventos de arrastre se traga todas las excepciones. Puede pensar que su código de evento se ejecuta sin problemas, mientras que está generando excepciones por todas partes. No puedes verlos porque el marco los roba.
Es por eso que siempre pongo un try / catch en estos controladores de eventos, solo para saber si lanzan alguna excepción. Usualmente pongo un Debugger.Break (); en la parte de captura.
Antes del lanzamiento, después de la prueba, si todo parece comportarse, elimino o reemplazo estos con un manejo de excepciones real.
Otro problema común es pensar que puede ignorar los eventos Form DragOver (o DragEnter). Normalmente uso el evento DragOver del formulario para establecer el efecto permitido y luego el evento DragDrop de un control específico para manejar los datos descartados.
Aquí hay algo que solía soltar archivos y / o carpetas llenas de archivos. En mi caso, estaba filtrando *.dwg
solo archivos y elegí incluir todas las subcarpetas.
fileList
es un IEnumerable
o similar En mi caso estaba vinculado a un control WPF ...
var fileList = (IList)FileList.ItemsSource;
Consulte https://stackoverflow.com/a/19954958/492 para obtener detalles sobre ese truco.
The Drop Handler ...
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);
}
}
Puede implementar Drag & Drop en WinForms y WPF.
Debe agregar el evento 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);
}
...
}
Debe agregar el evento DragDrop:
private void YourElementControl_DragDrop (remitente del objeto, DragEventArgs e)
{
...
foreach (string path in (string[])e.Data.GetData(DataFormats.FileDrop))
{
File.Copy(path, DirPath + Path.GetFileName(path));
}
...
}