2011-04-14 33 views
75

Necesito colocar un archivo de imagen en mi aplicación WPF. Actualmente tengo un evento que se activa cuando coloco los archivos, pero no sé qué hacer a continuación. ¿Cómo obtengo la imagen? ¿El objeto sender es la imagen o el control?Arrastrar y soltar archivos en WPF

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? 
} 

Respuesta

163

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 se olvide de conectar realmente el caso en XAML, así como establecer el atributo AllowDrop.

<StackPanel Name="ImagePanel" Drop="ImagePanel_Drop" AllowDrop="true"> 
    ... 
</StackPanel> 
+0

impresionante funciona a las mil maravillas, simplemente cambiados "HandleFileOpen (archivos [0]);" a "foreach (archivo de cadena en archivos) {OpenFile (archivo);}" - Gracias :) –

+4

Esto no funciona para mí:/ –

+0

@Matteo Care para elaborar? –

33

El archivo de imagen está contenida en el parámetro e, que es una instancia de la DragEventArgs class.
(El parámetro sender contiene una referencia al objeto que provoca el evento.)

Específicamente, active la e.Data member; como explica la documentación, esto devuelve una referencia al objeto de datos (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 está buscando. Probablemente quiera comenzar llamando al GetFormats method 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 está arrastrando, llamará a una de las sobrecargas específicas del GetData método para recuperar realmente el objeto de datos en un formato particular.

7

Respuesta adicional de A.R. tenga en cuenta que si desea utilizar TextBox para dejar caer, debe saber lo siguiente.

TextBox parece que ya tiene un manejo predeterminado para DragAndDrop. Si su objeto de datos es String, simplemente funciona. No se manejan otros tipos y obtienes el efecto de mouse prohibido y nunca se llama a tu controlador de soltar.

Parece que puede activar su propio manejo con e.Handled a ciertoPreviewDragOver en un manejador de eventos.

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); 
    } 
} 
+0

El ejemplo de AR pierde el controlador PreviewDragOver, que es un poco importante para hacer todo se une. Prestigio. –

Cuestiones relacionadas