我需要将图像文件拖放到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永远不会调用事件处理程序。当我将文件拖到窗口上时,我看到一个“被拒绝的”圆形符号
Gridroot元素,其Border内部将Background属性设置为某种东西(白色很好,但不透明)。Border我里面放了实际的内容。
图像文件包含在e参数中,该参数是DragEventArgsclass的实例。
(该sender参数包含对引发事件的对象的引用。)
具体来说,检查e.Data成员;如文档所述,这将返回对IDataObject包含来自拖动事件中数据的数据对象()的引用。
该IDataObject接口提供了许多方法来检索您要使用的数据对象。您可能首先需要调用该GetFormats方法,以查找正在使用的数据的格式。(例如,它是实际图像还是仅仅是图像文件的路径?)
然后,一旦确定了要拖入的文件的格式,就可以调用该GetData方法的特定重载之一,以特定格式实际检索数据对象。
此外,要回答AR,请注意,如果要使用TextBoxDrop,必须知道以下内容。
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);
}
}