[c#] 파일을 WPF로 끌어서 놓기

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



답변

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

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>


답변

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

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

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

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


답변

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


답변