파일을 WPF로 끌어서 놓기


106

내 WPF 응용 프로그램에 이미지 파일을 드롭해야합니다. 현재 파일을 놓을 때 이벤트가 발생하지만 다음에 어떻게해야할지 모르겠습니다. 이미지는 어떻게 얻습니까? 는 IS 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?
}

답변:


211

이것은 기본적으로 당신이 원하는 것입니다.

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>

멋진 작품이 매력적입니다. "HandleFileOpen (files [0]);"을 바꿨습니다. to "foreach (string file in files) {Openfile (file);}"-감사합니다 :)
Eamonn McEvoy

1
죄송합니다 :) 드래그 앤 드롭이 작동하지 않습니다. AllowDropTrue로 설정되어 있지만 Drop이벤트 처리기가 호출되지 않습니다. 나는 창을 통해 파일을 드래그 할 때, 나는 "거부"원형 심볼 참조
mcont

4
나는 속성이 무언가로 설정된 내부와 Grid함께 루트 요소로 사용했습니다 (흰색은 좋지만 투명하지는 않습니다). 안에 실제 내용을 넣었습니다. BorderBackgroundBorder
mcont

1
배경을 투명으로 설정하면 Grid에 떨어질 때 잘 작동했습니다. 적중 테스트가 발생하려면 배경이 필요합니다. 이 블로그 항목에 감사 : codeinreview.com/136/enabling-drag-and-drop-over-a-grid-in-wpf
DustinA

1
한 가지 진짜 좋은 점은 VisualStudio를 관리자로 실행하고 앱을 디버그하고 FileExplorer에서 관리자가 아닌 사용자로 드래그하면 보안 컨텍스트가 다르고 드래그 이벤트가 트리거되지 않는다는 것입니다. 삶의 30 분을 낭비했습니다.
Hans Karlsen

35

이미지 파일은 클래스e 의 인스턴스 인 매개 변수에 포함되어 있습니다. ( 매개 변수는 이벤트를 발생시킨 개체에 대한 참조를 포함합니다.)DragEventArgs
sender

특히 e.Data회원을 확인하십시오 . 설명서에 설명 IDataObject된대로 드래그 이벤트의 데이터를 포함하는 데이터 객체 ( )에 대한 참조를 반환합니다 .

IDataObject인터페이스는 후있어하는 데이터 객체를 검색하기위한 방법을 제공합니다. 작업중인 데이터의 형식을 찾기 위해 GetFormats메서드 를 호출하여 시작하는 것이 좋습니다. (예를 들어, 실제 이미지입니까 아니면 단순히 이미지 파일의 경로입니까?)

그런 다음 드래그되는 파일의 형식을 확인한 후 GetData메서드 의 특정 오버로드 중 하나를 호출 하여 실제로 특정 형식의 데이터 개체를 검색합니다.


12

AR의 답변 외에도 TextBox드롭 에 사용 하려면 다음 사항을 알아야합니다.

TextBox에 대한 기본 처리가 이미있는 것 같습니다 DragAndDrop. 데이터 개체가 String이면 단순히 작동합니다. 다른 유형은 처리되지 않으며 금지 된 마우스 효과가 발생 하고 Drop 핸들러가 호출되지 않습니다.

당신이 당신의 자신의 처리를 활성화 할 수 있습니다 것 같아 e.Handled진정한 A의 PreviewDragOver이벤트 핸들러.

XAML

<TextBox AllowDrop="True"    x:Name="RtbInputFile"      HorizontalAlignment="Stretch"   HorizontalScrollBarVisibility="Visible"  VerticalScrollBarVisibility="Visible" />

씨#

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
AR의 예제에는 모두 함께 모이는 데 중요한 PreviewDragOver 핸들러가 누락되었습니다. 명성.
Greg Vogel 2017
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.