[英]Drag and drop files into WPF
I need to drop an image file into my WPF application. 我需要将图像文件放入我的WPF应用程序中。 I currently have a event firing when I drop the files in, but I don't know how what to do next. 当我放下文件时,我目前有一个事件触发,但我不知道接下来该怎么做。 How do I get the Image? 我如何获得图像? Is the sender
object the image or the control? 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?
}
This is basically what you want to do. 这基本上就是你想要做的。
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]);
}
}
Also, don't forget to actually hook up the event in XAML, as well as setting the AllowDrop
attribute. 另外,不要忘记在XAML中实际连接事件,以及设置AllowDrop
属性。
<StackPanel Name="ImagePanel" Drop="ImagePanel_Drop" AllowDrop="true">
...
</StackPanel>
The image file is contained in the e
parameter, which is an instance of the DragEventArgs
class . 图像文件包含在e
参数中,该参数是DragEventArgs
类的一个实例。
(The sender
parameter contains a reference to the object that raised the event.) ( sender
参数包含对引发事件的对象的引用。)
Specifically, check the e.Data
member ; 具体来说,检查e.Data
成员 ; as the documentation explains, this returns a reference to the data object ( IDataObject
) that contains the data from the drag event. 如文档所述,这将返回对包含来自拖动事件的数据的数据对象( IDataObject
)的引用。
The IDataObject
interface provides a number of methods for retrieving the data object that you're after. IDataObject
接口提供了许多方法来检索您所追求的数据对象。 You'll probably want to start by calling the GetFormats
method in order to find out the format of the data that you're working with. 您可能希望首先调用GetFormats
方法 ,以找出您正在使用的数据的格式。 (For example, is it an actual image or simply the path to an image file?) (例如,它是实际图像还是图像文件的路径?)
Then, once you've identified the format of the file being dragged in, you'll call one of the specific overloads of the GetData
method to actually retrieve the data object in a particular format. 然后,一旦确定了被拖入文件的格式,就会调用GetData
方法的一个特定重载来实际检索特定格式的数据对象。
Additionally to answer of AR please note that if you want to use TextBox
to drop you have to know following stuff. 另外要回答AR请注意,如果你想使用TextBox
,你必须知道以下内容。
TextBox
seems to have already some default handling for DragAndDrop
. TextBox
似乎已经为DragAndDrop
进行了一些默认处理。 If your data object is a String
, it simply works. 如果您的数据对象是String
,它就可以正常工作。 Other types are not handled and you get the Forbidden mouse effect and your Drop handler is never called. 其他类型未处理,您将获得Forbidden鼠标效果,并且永远不会调用Drop处理程序。
It seems like you can enable your own handling with e.Handled
to true in a PreviewDragOver
event handler. 好像你可以让自己的处理与e.Handled
为true在PreviewDragOver
事件处理程序。
XAML XAML
<TextBox AllowDrop="True" x:Name="RtbInputFile" HorizontalAlignment="Stretch" HorizontalScrollBarVisibility="Visible" VerticalScrollBarVisibility="Visible" />
C# 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);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.