Arrastrar y soltar archivos

Apartir de la versión 4 de Silverlight se da soporte al drag & drop de archivos. Se puede hacer desde dentro de la aplicación o bien desde fuera (Sistema Operativo) hasta la aplicación. Al revés no funciona.

La clase UIElement incluye la propiedad AllowDrop, que indica si el elemento visual soporta la operación de arrastrar y soltar. Dado que Drop es un evento enrutado, podemos implementar un manejador de evento, en el objeto o en la raíz, dependiendo si queremos o no obligar al usuario que suelte el archivo en un área específica.

Veamos como manejar el evento a nivel de UserControl:

 

  < UserControl    
  x:Name="MiAplicacionPrueba" x:Class="SilverlightApplication1.MainPage"   
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"   
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"   
  xmlns:d="http://schemas.microsoft.com/expression/blend/2008"   
  xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"   
  mc:Ignorable="d"   d:DesignHeight="300"    d:DesignWidth="400"   
  Loaded="HazAlgo"   
  AllowDrop="True"   Drop="UserControl_Drop" >

En la propiedad Data del objeto de argumentos del evento Drop está implementado el método GetDataPresent que sirve para ver si hay datos que se puedan leer, así como el método GetData que nos sirve para leer dichos datos. El objeto que no devuelve el método GetData se puede convertir en un array de tipo FileInfo, por lo que podremos leer cada uno de los archivos soltados.

....
using System.IO;
...
        private void UserControl_Drop(object sender, DragEventArgs e)
        {
            System.IO.FileInfo[] Archivos;        
            if (e.Data.GetDataPresent(DataFormats.FileDrop))
            {
                Archivos = e.Data.GetData(DataFormats.FileDrop) as FileInfo[];
                foreach (System.IO.FileInfo Fch in Archivos)
                {
                    // hacer algo
                }
            }
        }

Si la aplicación se está ejecutando en Confianza Parcial no podrá leer toda la información de los archivos soltados, como por ejemplo, la ruta del archivo. Esto solo se podrá hacer si se ejecuta en Confianza Eleveda.

Veamos un ejemplo en el que leemos el contenido de un archivo de texto (.txt).

...

        private void UserControl_Drop(object sender, DragEventArgs e)
        {
            System.IO.FileInfo[] Archivos;

            if (e.Data.GetDataPresent(DataFormats.FileDrop))
            {
                Archivos = e.Data.GetData(DataFormats.FileDrop) as FileInfo[];
                foreach (System.IO.FileInfo Fch in Archivos)
                {
                    if (Fch.Extension.EndsWith("txt"))
                    {
                        using (Stream stream = Fch.OpenRead())
                        {
                            using (StreamReader reader = new StreamReader(stream))
                            {
                                string contenido = reader.ReadToEnd();
                                TxtFicheros.Text += contenido;
                                reader.Close();
                            }
                        }

                    }
                }
            }

        }

 

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.