将文件拖放到 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?
}
90700 次浏览

图像文件包含在 e参数中,该参数是 DragEventArgs的一个实例。
(sender参数包含对引发事件的对象的引用。)

具体来说,检查 e.Data成员; 正如文档解释的那样,它返回对数据对象(IDataObject)的引用,该数据对象包含来自拖动事件的数据。

IDataObject接口提供了许多用于检索所需数据对象的方法。您可能需要从调用 GetFormats方法开始,以便找出正在处理的数据的格式。(例如,它是一个实际的图像还是一个图像文件的路径?)

然后,一旦确定了所拖入文件的格式,就可以调用 GetData方法的一个特定重载来实际检索特定格式的数据对象。

这基本上就是你想要做的。

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 的事件,以及设置 abc0属性。

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

另外,关于 A.R 的答案,请注意,如果你想使用 TextBox去掉你必须知道以下的东西。

TextBox似乎已经为 DragAndDrop提供了一些默认处理。如果您的数据对象是 String,那么它就可以正常工作。其他类型没有处理,您得到的是 禁止鼠标效应,而且不会调用 Drop 处理程序。

似乎您可以在 PreviewDragOver事件处理程序中启用自己对 e.Handled没错的处理。

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