2012-06-15 7 views
7

Próbuję zaimplementować funkcjonalność w mojej aplikacji WPF, aby przeciągnąć obraz z przeglądarki do okna w mojej aplikacji WPF.Przeciąganie i upuszczanie obrazu z przeglądarki do aplikacji WPF

Kod działa dobrze z przeglądarką Firefox i Windows Explorer, ale pojawiają się problemy z Chrome i IE (jeszcze nie próbowałem żadnych innych przeglądarek).

Oto fragment kodu:

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

Patrząc na wyjściu, wydaje się, że Firefox faktycznie zapisuje obraz do schowka, natomiast Chrome jest po prostu chwytając html obrazu, natomiast IE nie robić cokolwiek z tym.

Ktoś ma pewien wgląd w to, jak mogę uzyskać funkcjonalność w różnych przeglądarkach?


Aktualizacja: Kilka obejścia znalazłem są do analizowania html (Chrome/Firefox) do źródła obrazu, a następnie pobrać ze źródła przy użyciu coś podobnego obiektu WebClient. Wolałaby jednak metodę, która ma silniejsze sprawdzanie typu pliku.

IE9 i Firefox mają format pliku DeviceIndependentBitmap, który jest dostępny podczas przeciągania obrazu bez hiperłącza. Wydaje się, że jest to bezpieczniejsza alternatywa, chociaż wydaje się, że Chrome jej nie obsługuje. Nie jest to również użyteczne w przypadku obrazów hiperłączy.


Z Firefox, wyjście jest (Drag_Enter z jakiegoś powodu zostanie zwolniony dwa razy):

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 również pobiera opalane dwa razy):

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

Internet Explorer (ponownie , drag_enter wystrzelił dwukrotnie):

UntrustedDragDrop 
msSourceUrl 
FileGroupDescriptor 
FileGroupDescriptorW 
FileContents 
UniformResourceLocator 
Effects: Link 

Odpowiedz

1

Możesz użyć formatów FileGroupDescriptorW i FileContent, aby pobrać swoje dane.

  • FileGroupDescriptorW jest tablicą FileDescriptors', które opisują swoje dane (np .: nazwa, rozmiar, zmodyfikowanym czas, ...)
  • FileContent zawiera swoje zawartość pliku.

Jeśli nie dbają o nazwie pliku i wystarczy zawartość binarną można użyć

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

Jeśli chcesz bardziej w-dziale-tutorial jak używać FileGroupDescriptor (W) Mogę polecić to tutorial na codeproject.com. Mówi o przeciąganiu & z MS Outlook, ale używa tych samych formatów IDataObject.

Powiązane problemy