soltar evento drop arrastrar and c# .net wpf image drag-and-drop

c# - evento - Arrastre y suelte archivos en WPF



drag and drop c# picturebox (3)

Además de la respuesta de AR, tenga en cuenta que si desea utilizar TextBox para descartar, debe saber lo siguiente.

TextBox parece tener un manejo predeterminado para DragAndDrop . Si su objeto de datos es una String , simplemente funciona. No se manejan otros tipos y obtienes el efecto del mouse Prohibido y nunca se invoca a tu controlador Drop.

Parece que puede habilitar su propio manejo con e.Handled a true en un controlador de evento PreviewDragOver .

XAML

<TextBox AllowDrop="True" x:Name="RtbInputFile" HorizontalAlignment="Stretch" HorizontalScrollBarVisibility="Visible" VerticalScrollBarVisibility="Visible" />

DO#

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

Necesito dejar 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 sender es el objeto de 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? }


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

Específicamente, verifique el miembro e.Data ; 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 cantidad de métodos para recuperar el objeto de datos que está buscando. Probablemente quiera comenzar llamando al método GetFormats 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 hayas identificado el formato del archivo que se está arrastrando, llamarás a una de las sobrecargas específicas del método GetData para recuperar realmente el objeto de datos en un formato particular.


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

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