我需要将图像文件拖放到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?
}
我需要将图像文件拖放到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?
}
Answers:
这基本上就是您想要做的。
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>
AllowDrop
设置为True,但Drop
永远不会调用事件处理程序。当我将文件拖到窗口上时,我看到一个“被拒绝的”圆形符号
Grid
root元素,其Border
内部将Background
属性设置为某种东西(白色很好,但不透明)。Border
我里面放了实际的内容。
图像文件包含在e
参数中,该参数是DragEventArgs
class的实例。
(该sender
参数包含对引发事件的对象的引用。)
具体来说,检查e.Data
成员;如文档所述,这将返回对IDataObject
包含来自拖动事件中数据的数据对象()的引用。
该IDataObject
接口提供了许多方法来检索您要使用的数据对象。您可能首先需要调用该GetFormats
方法,以查找正在使用的数据的格式。(例如,它是实际图像还是仅仅是图像文件的路径?)
然后,一旦确定了要拖入的文件的格式,就可以调用该GetData
方法的特定重载之一,以特定格式实际检索数据对象。
此外,要回答AR,请注意,如果要使用TextBox
Drop,必须知道以下内容。
TextBox
似乎已经对进行了一些默认处理DragAndDrop
。如果您的数据对象是String
,它就可以正常工作。其他类型不会被处理,并且您会获得“ 禁止鼠标”效果,并且不会调用Drop处理程序。
似乎您可以在事件处理程序中将自己的处理设置e.Handled
为truePreviewDragOver
。
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);
}
}