Kéo và thả tệp vào WPF


106

Tôi cần thả tệp hình ảnh vào ứng dụng WPF của mình. Tôi hiện có sự kiện kích hoạt khi tôi thả tệp vào, nhưng tôi không biết phải làm gì tiếp theo. Làm cách nào để lấy Hình ảnh? Là senderđối tượng hình ảnh hoặc sự kiểm soát?

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?
}

Câu trả lời:


211

Về cơ bản đây là những gì bạn muốn làm.

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

Ngoài ra, đừng quên thực sự kết nối sự kiện trong XAML, cũng như thiết lập AllowDropthuộc tính.

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

tuyệt vời làm việc một cách quyến rũ, chỉ cần hoán đổi "HandleFileOpen (files [0]);" tới "foreach (chuỗi tệp trong các tệp) {Openfile (tệp);}" - Cảm ơn :)
Eamonn McEvoy

1
Xin lỗi :) Ý tôi là kéo và thả không hoạt động. AllowDropđược đặt thành True nhưng Droptrình xử lý sự kiện không bao giờ được gọi. Khi tôi kéo một tệp qua cửa sổ, tôi thấy một biểu tượng hình tròn "bị từ chối"
mcont

4
Tôi đã sử dụng một Gridphần tử làm gốc, với Borderbên trong có thuộc Backgroundtính được đặt thành một cái gì đó (màu trắng cũng được, nhưng không trong suốt). Bên trong Bordertôi đặt nội dung thực tế.
mcont

1
Đặt nền thành trong suốt hoạt động tốt đối với tôi khi cố gắng thả vào Lưới. Rõ ràng bạn cần một nền tảng để thử nghiệm hit xảy ra. Cảm ơn mục blog này: codeinreview.com/136/enabling-drag-and-drop-over-a-grid-in-wpf
DustinA

1
Một Gotcha thực sự là nếu bạn chạy VisualStudio với tư cách Quản trị viên - gỡ lỗi ứng dụng của bạn - và kéo từ FileExplorer với tư cách không phải là quản trị viên, ngữ cảnh bảo mật sẽ khác và không có sự kiện kéo nào sẽ kích hoạt. Tốn 30 phút cuộc đời của tôi.
Hans Karlsen

35

Tệp hình ảnh được chứa trong etham số, là một thể hiện của DragEventArgslớp .
( senderTham số chứa một tham chiếu đến đối tượng đã tạo ra sự kiện.)

Cụ thể là kiểm tra e.Datathành viên ; như tài liệu giải thích, điều này trả về một tham chiếu đến đối tượng dữ liệu ( IDataObject) có chứa dữ liệu từ sự kiện kéo.

Các IDataObjectgiao diện cung cấp một số phương pháp để lấy các đối tượng dữ liệu mà bạn đang theo đuổi. Có thể bạn sẽ muốn bắt đầu bằng cách gọi GetFormatsphương thức để tìm ra định dạng dữ liệu mà bạn đang làm việc. (Ví dụ: đó là hình ảnh thực tế hay chỉ đơn giản là đường dẫn đến tệp hình ảnh?)

Sau đó, khi bạn đã xác định được định dạng của tệp đang được kéo vào, bạn sẽ gọi một trong các quá tải cụ thể của GetDataphương thức để thực sự truy xuất đối tượng dữ liệu ở một định dạng cụ thể.


12

Ngoài ra, để trả lời AR, xin lưu ý rằng nếu bạn muốn sử dụng TextBoxđể thả, bạn phải biết những điều sau đây.

TextBoxdường như đã có một số xử lý mặc định cho DragAndDrop. Nếu đối tượng dữ liệu của bạn là a String, nó chỉ hoạt động. Các loại khác không được xử lý và bạn nhận được hiệu ứng chuột Cấm và trình xử lý Drop của bạn không bao giờ được gọi.

Nó có vẻ như bạn có thể bật xử lý của riêng bạn với e.Handledđể đúng trong một PreviewDragOverxử lý sự kiện.

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

1
Ví dụ của AR bỏ sót trình xử lý PreviewDragOver, điều này rất quan trọng để làm cho tất cả kết hợp với nhau. Thanh danh.
Greg Vogel
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.