简体   繁体   English

将文件拖放到WPF中

[英]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.HandledtruePreviewDragOver事件处理程序。

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM