2012-06-15 18 views
7

Estoy tratando de implementar la funcionalidad en mi aplicación WPF para arrastrar una imagen desde un navegador a una ventana en mi aplicación WPF.Imagen de arrastrar y soltar del navegador a la aplicación WPF

El código funciona bien con Firefox y Windows Explorer, pero surgen problemas con Chrome e IE (aún no lo he probado con otros navegadores).

He aquí un fragmento de código:

private void Drag_Enter(object sender, DragEventArgs e) 
{ 
    foreach (string format in e.Data.GetFormats()) 
     Console.WriteLine(format); 
    Console.WriteLine("Effects:" + e.AllowedEffects); 
} 

private void Drag_Drop(object sender, DragEventArgs e) 
{ 
    string[] files = (string[])e.Data.GetData(DataFormats.FileDrop); 
    ImageSourceConverter converter = new ImageSourceConverter(); 
    foreach (string file in files) 
    { 
     if (converter.IsValid(file)) 
     { 
      // Do something with the image 
     } 
    } 
} 

En cuanto a la salida, parece que Firefox realidad guarda la imagen en el portapapeles, mientras que Chrome es sólo sacar el html de la imagen, mientras que IE no hace cualquier cosa con eso.

¿Alguien tiene alguna idea de cómo puedo obtener la funcionalidad de navegador cruzado?


actualización: Un par de soluciones que he encontrado son para analizar el html (Chrome/Firefox) para una fuente de imagen, a continuación, descarga de la fuente usando algo como el objeto cliente Web. Preferiría un método, sin embargo, que tenga una comprobación más sólida para el tipo de archivo.

IE9 y Firefox tienen un formato de archivo DeviceIndependentBitmap que está disponible al arrastrar una imagen que no es de hipervínculo. Esta parece ser una alternativa más segura, aunque Chrome no parece ser compatible. Tampoco es tan útil con imágenes de hipervínculos.


Con Firefox, la salida es (Drag_Enter por alguna razón es despedido dos veces):

text/x-moz-url 
FileGroupDescriptor 
FileGroupDescriptorW 
FileContents 
UniformResourceLocator 
UniformResourceLocatorW 
text/x-moz-url-data 
text/x-moz-url-desc 
text/uri-list 
text/_moz_htmlcontext 
text/_moz_htmlinfo 
text/html 
HTML Format 
Text 
UnicodeText 
System.String 
application/x-moz-nativeimage 
DeviceIndependentBitmap 
FileDrop 
FileNameW 
FileName 
Preferred DropEffect 
application/x-moz-file-promise-url 
application/x-moz-file-promise-dest-filename 
DragImageBits 
DragContext 
Effects: Link, All 

Chrome (drag_enter también es despedido dos veces):

DragContext 
DragImageBits 
FileGroupDescriptorW 
FileContents 
HTML Format 
text/html 
text/x-moz-url 
UniformResourceLocatorW 
UniformResourceLocator 
Text 
UnicodeText 
System.String 
Effects: Copy, Move, Link 

Internet Explorer (de nuevo , drag_enter dispara dos veces):

UntrustedDragDrop 
msSourceUrl 
FileGroupDescriptor 
FileGroupDescriptorW 
FileContents 
UniformResourceLocator 
Effects: Link 

Respuesta

1

Puede usar los formatos FileGroupDescriptorW y FileContent para obtener sus datos.

  • FileGroupDescriptorW es una matriz de FileDescriptors' que describen los datos (ej .: nombre, tamaño, tiempo modificado, ...)
  • fileContent contiene el contenido del archivo.

Si no se preocupan por el nombre de archivo y sólo tiene el contenido binario se puede usar

var filestream = (MemoryStream[])dataObject.GetData("FileContents"); 

Si quieres una más en dept-tutorial sobre cómo utilizar el FileGroupDescriptor (W) Puedo recomendar este tutorial en codeproject.com. Habla de arrastrar & soltar desde MS Outlook, pero utiliza los mismos formatos IDataObject.

Cuestiones relacionadas