画像ファイルを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?
}
これは基本的にあなたがやりたいことです。
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>
画像ファイルは、 e
class のインスタンスであるDragEventArgs
パラメーターに含まれています。
(sender
パラメーターには、イベントを発生させたオブジェクトへの参照が含まれます。)
具体的には、 e.Data
メンバー ;ドキュメントが説明しているように、これは、ドラッグイベントからのデータを含むデータオブジェクト( IDataObject
)への参照を返します。
IDataObject
インターフェイスには、目的のデータオブジェクトを取得するための多数のメソッドが用意されています。おそらく、 GetFormats
method を呼び出して、作業しているデータの形式を確認することをお勧めします。 (たとえば、実際の画像ですか、それとも単に画像ファイルへのパスですか?)
次に、ドラッグするファイルの形式を特定したら、GetData
メソッドの特定のオーバーロードの1つを呼び出して、特定の形式のデータオブジェクトを実際に取得します。
A.R.の回答に加えてTextBox
を使用してドロップする場合は、次のものを知っている必要があることに注意してください。
TextBox
には、DragAndDrop
のデフォルトの処理がすでにいくつかあるようです。データオブジェクトがString
である場合、単に機能します。他のタイプは処理されず、Forbidden mouse effectが表示され、Dropハンドラーは呼び出されません。
PreviewDragOver
イベントハンドラでe.Handled
をtrueに設定すると、独自の処理を有効にできるようです。
[〜#〜] 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);
}
}