9

WPF アプリケーションに機能を実装して、画像をブラウザーから WPF アプリのウィンドウにドラッグしようとしています。

このコードは Firefox と Windows エクスプローラーでは問題なく動作しますが、Chrome と IE では問題が発生します (他のブラウザーはまだ試していません)。

コード スニペットを次に示します。

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

出力を見ると、Firefox は実際に画像をクリップボードに保存しているように見えますが、Chrome は画像の html を取得しているだけで、IE は何もしていません。

クロスブラウザ機能をどのように取得するかについて、誰か洞察がありますか?


更新: 私が見つけたいくつかの回避策は、画像ソースの html (Chrome/Firefox) を解析し、WebClient オブジェクトなどを使用してソースからダウンロードすることです。ただし、ファイルの種類をより強力にチェックする方法をお勧めします。

IE9 と Firefox には両方とも、非ハイパーリンク画像をドラッグするときに使用できる DeviceIndependentBitmap ファイル形式があります。Chrome ではサポートされていないようですが、これはより安全な代替手段のようです。また、ハイパーリンク画像ではあまり役に立ちません。


Firefox では、出力は次のようになります (何らかの理由で Drag_Enter が 2 回発生します)。

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 も 2 回発生します):

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

Internet Explorer (ここでも、drag_enter が 2 回発生):

UntrustedDragDrop
msSourceUrl
FileGroupDescriptor
FileGroupDescriptorW
FileContents
UniformResourceLocator
Effects: Link
4

1 に答える 1

1

FileGroupDescriptorWおよびFileContent形式を使用してデータを取得できます。

  • FileGroupDescriptorWは、データを記述するFileDescriptorsの配列です(例:名前、サイズ、変更時刻など)。
  • FileContentには、ファイルの内容が含まれています。

ファイル名を気にせず、使用できるバイナリコンテンツだけが必要な場合

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

FileGroupDescriptor(W)の使用方法に関するより詳細なチュートリアルが必要な場合は、codeproject.comでこのチュートリアルをお勧めします。MS Outlookからのドラッグアンドドロップについて説明していますが、同じIDataObject形式を使用しています。

于 2012-08-20T13:03:23.363 に答える