Arrastrar y soltar archivos en WPF


Necesito soltar un archivo de imagen en mi aplicación WPF. Actualmente tengo un evento disparando cuando dejo caer los archivos, pero no se qué hacer a continuación. ¿Cómo obtengo la Imagen? ¿El objeto sender es la imagen o el control?

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?
}
Author: Cody Gray, 2011-04-14

3 answers

Esto es básicamente lo que quieres hacer.

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

Además, no olvides conectar el evento en XAML, así como establecer el atributo AllowDrop.

<StackPanel Name="ImagePanel" Drop="ImagePanel_Drop" AllowDrop="true">
    ...
</StackPanel>
 172
Author: A.R.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-02 20:21:30

El archivo de imagen está contenido en el parámetro e, que es una instancia del DragEventArgs clase .
(El parámetro sender contiene una referencia al objeto que generó el evento.)

Específicamente, compruebe la e.Data member ; como explica la documentación, esto devuelve una referencia al objeto data (IDataObject) que contiene los datos del evento de arrastre.

La interfaz IDataObject proporciona una serie de métodos para recuperar el objeto de datos que lo que buscas. Probablemente querrá comenzar llamando al GetFormats método para averiguar el formato de los datos con los que está trabajando. (Por ejemplo, ¿es una imagen real o simplemente la ruta a un archivo de imagen?)

Luego, una vez que haya identificado el formato del archivo que se arrastra, llamará a una de las sobrecargas específicas del método GetData para recuperar realmente el objeto de datos en un formato particular.

 33
Author: Cody Gray,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-04-14 11:33:07

Además de la respuesta de A. R. por favor, tenga en cuenta que si desea utilizar TextBox para soltar usted tiene que saber siguientes cosas.

TextBox parece tener ya algún manejo por defecto para DragAndDrop. Si su objeto de datos es un String, simplemente funciona. Otros tipos no son manejados y obtienes el efecto de ratón prohibido y tu manejador de Drop nunca es llamado.

Parece que puedes habilitar tu propio manejo con e.Handled a verdadero en un evento PreviewDragOver handler.

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);  
     }
}
 8
Author: Academy of Programmer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-24 14:08:30