web-dev-qa-db-ja.com

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

画像ファイルを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?
}
95
Eamonn McEvoy

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

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

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

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

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

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

IDataObjectインターフェイスには、目的のデータオブジェクトを取得するための多数のメソッドが用意されています。おそらく、 GetFormats method を呼び出して、作業しているデータの形式を確認することをお勧めします。 (たとえば、実際の画像ですか、それとも単に画像ファイルへのパスですか?)

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

35
Cody Gray

A.R.の回答に加えてTextBoxを使用してドロップする場合は、次のものを知っている必要があることに注意してください。

TextBoxには、DragAndDropのデフォルトの処理がすでにいくつかあるようです。データオブジェクトがStringである場合、単に機能します。他のタイプは処理されず、Forbidden mouse effectが表示され、Dropハンドラーは呼び出されません。

PreviewDragOverイベントハンドラでe.Handledtrueに設定すると、独自の処理を有効にできるようです。

[〜#〜] 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);  
     }
}
9
Developer