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