ファイルをWPFにドラッグアンドドロップする


106

WPFアプリケーションに画像ファイルをドロップする必要があります。現在、ファイルをドロップするとイベントが発生しますが、次に何をするかわかりません。画像を取得するにはどうすればよいですか?あるsenderオブジェクトは、画像やコントロール?

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

回答:


211

これは基本的にあなたがやりたいことです。

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]);
  }
}

また、XAMLで実際にイベントをフックすること、およびAllowDrop属性を設定することを忘れないでください。

<StackPanel Name="ImagePanel" Drop="ImagePanel_Drop" AllowDrop="true">
    ...
</StackPanel>

awesomeは魅力的に機能し、「HandleFileOpen(files [0]);」を交換しただけです。"foreach(string file in files){Openfile(file);}"に感謝
Eamonn McEvoy

1
申し訳ありません:)ドラッグアンドドロップが機能しないことを意味します。AllowDropTrueに設定されていますが、Dropイベントハンドラーは呼び出されません。ウィンドウ上にファイルをドラッグすると、「拒否された」円形のシンボルが表示されます
mcont

4
Gridはルート要素として使用し、Border内部をBackgroundプロパティに設定しました(白は問題ありませんが、透明ではありません)。内部Borderには実際のコンテンツを入れています。
mcont 2015年

1
グリッドにドロップするときに、背景を透明に設定するとうまくいきました。どうやらあなたはヒットテストが起こるように背景が必要です。このブログエントリのおかげで:codeinreview.com/136/enabling-drag-and-drop-over-a-grid-in-wpf
DustinA

1
実際のGotchaの1つは、VisualStudioを管理者として実行し(アプリをデバッグし)、FileExplorerから管理者以外としてドラッグすると、セキュリティコンテキストが異なり、ドラッグイベントがトリガーされないことです。人生の30分を費やしました。
Hans Karlsen

35

画像ファイルは eDragEventArgsクラスのインスタンスであるパラメータにます。
senderパラメーターには、イベントを発生させたオブジェクトへの参照が含まれています。)

具体的には、 e.Dataメンバーを。ドキュメントで説明されているようにIDataObject、ドラッグイベントからのデータを含むデータオブジェクト()への参照が返されます。

IDataObjectインターフェースは、目的のデータオブジェクトを取得するためのいくつかのメソッドを提供します。おそらく、操作しているデータの形式を見つけるためにGetFormatsメソッドを呼び出すことから始めたいと思うでしょう。(たとえば、実際の画像ですか、それとも単に画像ファイルへのパスですか?)

次に、ドラッグインされるファイルの形式を特定したら、GetDataメソッドの特定のオーバーロードの1つを呼び出して、実際に特定の形式でデータオブジェクトを取得します。


12

さらに、ARの回答にはTextBox、ドロップに使用する場合は、以下のことを知っておく必要があることに注意してください。

TextBoxのデフォルトの処理はすでにいくつかあるようですDragAndDrop。データオブジェクトがの場合String、それは単に機能します。他のタイプは処理されず、Forbiddenマウス効果が発生し、Dropハンドラーが呼び出されることはありません。

あなたがあなた自身の取り扱いを有効にすることができますように思えるe.HandledPreviewDragOverイベントハンドラ。

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

1
ARの例では、PreviewDragOverハンドラーがありません。これは、すべてを1つにまとめるために重要です。称賛。
Greg Vogel
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.