끌어서 놓기 개요
업데이트: 2011년 4월
이 항목에서는 Windows Presentation Foundation (WPF) 응용 프로그램에서 제공하는 끌어서 놓기 기능에 대해 간략하게 설명합니다. 일반적으로 끌어서 놓기는 마우스나 기타 포인팅 장치를 사용하여 하나 이상의 개체를 선택하고 이러한 개체를 user interface (UI)의 원하는 놓기 대상 위로 끌어서 놓는 작업을 포함하는 데이터 전송의 한 방법입니다.
이 항목에는 다음 단원이 포함되어 있습니다.
- WPF의 끌어서 놓기 지원
- 데이터 전송
- 끌어서 놓기 이벤트
- 끌어서 놓기 구현
- 끌어서 놓기 예제
- 관련 항목
WPF의 끌어서 놓기 지원
일반적으로 끌어서 놓기 작업은 두 개의 부분으로 구성되는데 하나는 끌어오는 개체가 시작되는 끌기 소스이고 다른 하나는 끌어온 개체를 받는 놓기 대상입니다. 끌기 소스 및 놓기 대상은 동일한 응용 프로그램이나 다른 응용 프로그램의 UI 요소가 될 수 있습니다.
끌어서 놓기를 사용하여 조작할 수 있는 개체의 형식과 수는 상황에 따라 달라집니다. 예를 들어 파일, 폴더 및 선택한 콘텐츠는 끌어서 놓기 작업을 통해 조작되는 매우 일반적인 개체에 속합니다.
끌어서 놓기 작업 도중에 수행되는 특정 작업은 응용 프로그램과 관련되며 일반적으로 컨텍스트에 의해 결정됩니다. 예를 들어 선택한 파일을 동일한 저장 장치의 한 폴더에서 다른 폴더로 끌면 기본적으로 파일이 이동하지만 Universal Naming Convention (UNC) 공유에서 로컬 폴더로 파일을 끌면 기본적으로 파일이 복사됩니다.
WPF에서 제공되는 끌어서 놓기 기능은 다양한 끌어서 놓기 시나리오를 지원하기 위해 매우 유연하게 사용자 지정할 수 있도록 디자인되었습니다. 끌어서 놓기는 단일 응용 프로그램 내에서 또는 서로 다른 응용 프로그램 간에 개체 조작을 지원합니다. WPF 응용 프로그램과 다른 Windows 응용 프로그램 간의 끌어서 놓기도 완전히 지원됩니다.
WPF에서는 모든 UIElement 또는 ContentElement에 대해 끌어서 놓기를 수행할 수 있습니다. 끌어서 놓기 작업에 필요한 이벤트 및 메서드는 DragDrop 클래스에 정의되어 있습니다. UIElement 및 ContentElement 클래스에는 DragDrop 연결 이벤트에 대한 별칭이 포함되어 있으므로 UIElement 또는 ContentElement가 기본 요소로 상속될 때 클래스 멤버 목록에 해당 이벤트가 나타납니다. 이러한 이벤트에 연결된 이벤트 처리기는 기본 DragDrop 연결 이벤트에 연결되며 동일한 이벤트 데이터 인스턴스를 받습니다. 자세한 내용은 UIElement.Drop 이벤트를 참조하십시오.
보안 정보 |
---|
OLE 끌어서 놓기는 인터넷 영역에 있는 동안 작동하지 않습니다. |
데이터 전송
끌어서 놓기는 매우 일반적인 데이터 전송 영역에 속합니다. 데이터 전송에는 끌어서 놓기와 복사하여 붙여넣기 작업이 포함됩니다. 끌어서 놓기 작업은 시스템 클립보드를 사용하여 서로 다른 개체 또는 응용 프로그램 간에 데이터를 전송하는 데 사용되는 복사하여 붙여넣기 또는 잘라내어 붙여넣기 작업과 비슷합니다. 두 작업 유형 모두에 다음이 필요합니다.
데이터를 제공하는 소스 개체
전송되는 데이터를 임시로 저장할 방법
데이터를 받는 대상 개체
복사하여 붙여넣기 작업에서는 시스템 클립보드를 사용하여 전송되는 데이터를 임시로 저장하고, 끌어서 놓기 작업에서는 DataObject를 사용하여 데이터를 저장합니다. 개념적으로 데이터 개체는 실제 데이터를 포함하는 Object와 해당하는 데이터 형식 식별자로 이루어진 하나 이상의 쌍으로 구성됩니다.
끌기 소스는 정적 DragDrop.DoDragDrop 메서드를 호출하고 이 메서드에 전송할 데이터를 전달하여 끌어서 놓기 작업을 시작합니다. DoDragDrop 메서드는 필요한 경우 이 데이터를 DataObject에 자동으로 래핑합니다. 데이터 형식을 보다 효과적으로 제어하기 위해 데이터를 DoDragDrop 메서드에 전달하기 전에 DataObject에 래핑할 수 있습니다. 놓기 대상은 DataObject에서 데이터를 추출합니다. 데이터 개체 작업에 대한 자세한 내용은 데이터 및 데이터 개체를 참조하십시오.
끌어서 놓기 작업의 소스와 대상은 UI 요소이지만 실제로 전송되는 데이터에는 일반적으로 시각적 표현이 없습니다. Windows 탐색기에서 파일을 끌 때와 같이 끄는 데이터의 시각적 표현을 제공하는 코드를 작성할 수 있습니다. 기본적으로 데이터에 대해 끌어서 놓기 작업을 수행할 때의 결과(예: 데이터 이동 또는 복사)를 나타내도록 커서를 변경하면 사용자에게 피드백이 제공됩니다.
끌어서 놓기 결과
끌어서 놓기 작업은 전송되는 데이터에 여러 가지 결과로 나타날 수 있습니다. 예를 들어 데이터를 복사하거나 이동할 수 있습니다. WPF에는 끌어서 놓기 작업의 결과를 지정하는 데 사용할 수 있는 DragDropEffects 열거형이 정의되어 있습니다. 끌기 소스에서는 DoDragDrop 메서드로 소스에 허용되는 결과를 지정할 수 있습니다. 놓기 대상에서는 DragEventArgs 클래스의 Effects 속성으로 대상에 대해 의도한 결과를 지정할 수 있습니다. 놓기 대상이 DragOver 이벤트에서 의도한 결과를 지정하는 경우 이 정보는 GiveFeedback 이벤트에서 끌기 소스에 다시 전달됩니다. 끌기 소스에서는 이 정보를 사용하여 놓기 대상에서 데이터에 어떤 결과가 나타날지를 사용자에게 알려 줍니다. 데이터를 놓으면 놓기 대상은 Drop 이벤트에서 실제 결과를 지정합니다. 이 정보는 끌기 소스에 DoDragDrop 메서드의 반환 값으로 다시 전달됩니다. 놓기 대상이 끌기 소스의 allowedEffects 목록에 없는 결과를 반환하면 끌어서 놓기 작업이 취소되고 데이터가 전송되지 않습니다.
기억해야 할 중요한 점은 WPF에서 DragDropEffects 값은 끌기 소스와 놓기 대상 간에 끌어서 놓기 작업의 결과에 관한 정보 교환 기능을 제공하는 데만 사용된다는 것입니다. 끌어서 놓기 작업의 실제 결과는 사용자가 응용 프로그램에 적절한 코드를 작성하여 직접 지정할 수 있습니다.
예를 들어 놓기 대상에서는 대상에 데이터를 놓을 때 데이터를 이동하도록 결과를 지정할 수 있습니다. 그러나 데이터를 이동하려면 데이터를 대상 요소에 추가하고 소스 요소에서는 제거해야 합니다. 소스 요소에서는 데이터 이동이 허용됨을 나타낼 수 있지만, 데이터를 소스 요소에서 제거하는 코드를 제공하지 않으면 결과적으로 데이터가 복사만 되고 이동되지는 않습니다.
끌어서 놓기 이벤트
끌어서 놓기 작업은 이벤트 구동 모델을 지원합니다. 끌기 소스 및 놓기 대상은 표준 이벤트 집합을 사용하여 끌어서 작업을 처리합니다. 다음 표에는 표준 끌어서 놓기 이벤트가 요약되어 있습니다. 이러한 이벤트는 DragDrop 클래스에 대한 연결된 이벤트입니다. 연결된 이벤트에 대한 자세한 내용은 연결된 이벤트 개요를 참조하십시오.
끌기 소스 이벤트
Event |
요약 |
---|---|
[ E:System.Windows.DragDrop.GiveFeedback ] |
이 이벤트는 끌어서 놓기 작업을 수행하는 동안 계속해서 발생하며, 이 이벤트를 사용하면 놓기 소스에서 사용자에게 피드백 정보를 제공할 수 있습니다. 일반적으로 마우스 포인터의 모양을 놓기 대상에서 허용되는 결과를 나타내도록 변경하면 이 피드백을 제공할 수 있습니다. 이것은 버블링 이벤트입니다. |
[ E:System.Windows.DragDrop.QueryContinueDrag ] |
이 이벤트는 끌어서 놓기 작업 도중 키보드 또는 마우스 단추 상태가 변경될 때 발생하며 놓기 소스에서는 이를 통해 키/단추 상태에 따라 끌어서 놓기 작업을 취소할 수 있습니다. 이것은 버블링 이벤트입니다. |
[ E:System.Windows.DragDrop.PreviewGiveFeedback ] |
GiveFeedback의 터널링 버전 |
[ E:System.Windows.DragDrop.PreviewQueryContinueDrag ] |
QueryContinueDrag의 터널링 버전 |
놓기 대상 이벤트
Event |
요약 |
---|---|
[ E:System.Windows.DragDrop.DragEnter ] |
이 이벤트는 개체를 놓기 대상의 경계로 끌 때 발생합니다. 이것은 버블링 이벤트입니다. |
[ E:System.Windows.DragDrop.DragLeave ] |
이 이벤트는 개체를 놓기 대상의 경계 밖으로 끌 때 발생합니다. 이것은 버블링 이벤트입니다. |
[ E:System.Windows.DragDrop.DragOver ] |
이 이벤트는 개체를 놓기 대상의 경계 내에서 끌(이동할) 때 계속해서 발생합니다. 이것은 버블링 이벤트입니다. |
[ E:System.Windows.DragDrop.Drop ] |
이 이벤트는 개체를 놓기 대상에 놓을 때 발생합니다. 이것은 버블링 이벤트입니다. |
[ E:System.Windows.DragDrop.PreviewDragEnter ] |
DragEnter의 터널링 버전 |
[ E:System.Windows.DragDrop.PreviewDragLeave ] |
DragLeave의 터널링 버전 |
[ E:System.Windows.DragDrop.PreviewDragOver ] |
DragOver의 터널링 버전 |
[ E:System.Windows.DragDrop.PreviewDrop ] |
Drop의 터널링 버전 |
개체 인스턴스에 대한 끌어서 놓기 이벤트를 처리하려면 앞의 표에 나열된 이벤트에 대한 처리기를 추가합니다. 클래스 수준에서 끌어서 놓기 이벤트를 처리하려면 해당하는 가상 On*Event 및 On*PreviewEvent 메서드를 재정의합니다. 자세한 내용은 컨트롤 기본 클래스를 사용한 라우트된 이벤트의 클래스 처리를 참조하십시오.
끌어서 놓기 구현
UI 요소는 끌기 소스, 놓기 대상 또는 둘 모두가 될 수 있습니다. 기본적인 끌어서 놓기를 구현하려면 끌어서 놓기 작업을 시작하고 놓은 데이터를 처리하는 코드를 작성합니다. 선택적인 끌어서 놓기 이벤트를 처리하면 끌어서 놓기 기능을 향상시킬 수 있습니다.
기본적인 끌어서 놓기를 구현하려면 다음 작업을 수행합니다.
끌기 소스가 될 요소를 식별합니다. 끌기 소스는 UIElement 또는 ContentElement가 될 수 있습니다.
끌어서 놓기 작업을 시작할 끌기 소스에 대한 이벤트 처리기를 만듭니다. 해당 이벤트는 일반적으로 MouseMove입니다.
끌기 소스 이벤트 처리기에서 DoDragDrop 메서드를 호출하여 끌어서 놓기 작업을 시작합니다. DoDragDrop 호출에서 끌기 소스, 전송할 데이터 및 허용되는 결과를 지정합니다.
놓기 대상이 될 요소를 식별합니다. 놓기 대상은 UIElement 또는 ContentElement가 될 수 있습니다.
놓기 대상에서 AllowDrop 속성을 true로 설정합니다.
놓기 대상에서 전송된 데이터를 처리할 Drop 이벤트 처리기를 만듭니다.
Drop 이벤트 처리기에서 GetDataPresent 및 GetData 메서드를 사용하여 DragEventArgs에서 데이터를 추출합니다.
Drop 이벤트 처리기에서 이 데이터를 사용하여 원하는 끌어서 놓기 작업을 수행합니다.
사용자 지정 DataObject를 만들고 다음 작업과 같이 선택적인 끌기 소스 및 놓기 대상 이벤트를 처리하면 끌어서 놓기 구현을 향상시킬 수 있습니다.
사용자 지정 데이터나 여러 개의 데이터 항목을 전송하려면 DoDragDrop 메서드에 전달할 DataObject를 만듭니다.
끄는 동안 추가 작업을 수행하려면 놓기 대상에 대한 DragEnter, DragEnter, 및 DragEnter 이벤트를 처리합니다.
마우스 포인터의 모양을 변경하려면 끌기 소스에 대한 GiveFeedback 이벤트를 처리합니다.
끌어서 놓기 작업을 취소하는 방법을 변경하려면 끌기 소스에 대한 QueryContinueDrag 이벤트를 처리합니다.
끌어서 놓기 예제
이 단원에서는 Ellipse 요소에 대한 끌어서 놓기를 구현하는 방법을 설명합니다. Ellipse는 끌기 소스이면서 놓기 대상입니다. 전송되는 데이터는 타원의 Fill 속성에 대한 문자열 표현입니다. 다음 XAML에서는 Ellipse 요소와 이 요소가 처리하는 끌어서 놓기 관련 이벤트를 보여 줍니다. 끌어서 놓기 구현 방법을 보여 주는 전체 단계는 연습: 사용자 정의 컨트롤에서 끌어서 놓기 사용 항목을 참조하십시오.
요소가 끌기 소스가 될 수 있도록 설정
끌기 소스가 되는 개체는 다음 작업을 수행합니다.
끌기 발생 시기 식별
끌어서 놓기 작업 시작
전송할 데이터 식별
끌어서 놓기 작업 시 전송되는 데이터에 발생할 수 있는 결과 지정
끌기 소스에서는 허용되는 작업(이동, 복사, 없음)에 대한 피드백을 사용자에게 제공할 수도 있으며, 끌기 도중 Esc 키를 누르는 등의 추가 사용자 입력에 따라 끌어서 놓기 작업을 취소할 수도 있습니다.
끌기가 발생한 시기를 확인한 다음 DoDragDrop 메서드를 호출하여 끌어서 놓기 작업을 시작하는 것은 응용 프로그램에서 수행할 작업입니다. 일반적으로 이 작업은 마우스 단추를 누른 채 요소를 끌어 해당 요소에 대한 MouseMove 이벤트가 발생할 때 수행됩니다. 다음 예제에서는 Ellipse 요소의 MouseMove 이벤트 처리기에서 끌어서 놓기 작업을 시작하여 이 요소가 끌기 소스가 되도록 하는 방법을 보여 줍니다. 전송되는 데이터는 타원의 Fill 속성에 대한 문자열 표현입니다.
MouseMove 이벤트 처리기 내에서 DoDragDrop 메서드를 호출하여 끌어서 놓기 작업을 시작합니다. DoDragDrop 메서드에서는 다음 세 개의 매개 변수를 사용합니다.
dragSource - 전송되는 데이터의 소스인 종속성 개체에 대한 참조입니다. 일반적으로 MouseMove 이벤트의 소스입니다.
data - 전송되는 데이터를 포함하는 개체로, DataObject에 래핑됩니다.
allowedEffects - 끌어서 놓기 작업에 허용되는 결과를 지정하는 DragDropEffects 열거형 값 중 하나입니다.
data 매개 변수에는 serialize 가능한 모든 개체를 전달할 수 있습니다. 데이터가 아직 DataObject에 래핑되어 있지 않으면 새 DataObject에 자동으로 래핑됩니다. 여러 개의 데이터 항목을 전달하려면 DataObject를 직접 만들어 DoDragDrop 메서드에 전달합니다. 자세한 내용은 데이터 및 데이터 개체를 참조하십시오.
allowedEffects 매개 변수는 놓기 대상이 전송된 데이터에 대해 수행할 수 있는 작업을 끌기 소스에서 지정하는 데 사용됩니다. 끌기 소스에 대한 일반적인 값은 Copy, Move, 및All입니다.
참고 |
---|
놓기 대상에서 놓은 데이터에 대한 응답으로 대상이 의도하는 결과를 지정할 수도 있습니다.예를 들어 놓기 대상의 허용되는 결과를 None으로 설정하면 놓기 대상에서는 놓이는 데이터의 형식을 알 수 없는 경우 데이터를 거부할 수 있습니다.일반적으로 이 작업은 놓기 대상의 DragOver 이벤트 처리기에서 수행합니다. |
끌기 소스에서는 선택적으로 GiveFeedback 및 QueryContinueDrag 이벤트를 처리할 수 있습니다. 이러한 이벤트에는 이벤트를 처리된 것으로 표시하지 않은 경우에 사용되는 기본 처리기가 있습니다. 일반적으로 기본 동작을 변경해야 하는 특별한 이유가 없는 경우에는 이러한 이벤트를 무시합니다.
GiveFeedback 이벤트는 끌기 소스를 끄는 동안 계속해서 발생합니다. 이 이벤트의 기본 처리기는 끌기 소스가 올바른 놓기 대상 위에 있는지 확인합니다. 놓기 대상이 올바르면 놓기 대상의 허용되는 결과를 확인합니다. 그런 다음 최종 사용자에게 허용되는 놓기 결과에 관한 피드백을 제공합니다. 이 작업은 일반적으로 마우스 커서를 놓기 불가능, 복사 또는 이동 커서로 변경하여 수행합니다. 사용자 지정 커서를 사용하여 사용자에게 피드백을 제공해야 하는 경우에만 이 이벤트를 처리해야 합니다. 이 이벤트를 처리하는 경우에는 기본 처리기가 해당 처리기를 재정의하지 않도록 이 이벤트를 처리된 이벤트로 표시해야 합니다.
QueryContinueDrag 이벤트는 끌기 소스를 끄는 동안 계속해서 발생합니다. 이 이벤트를 처리하여 Esc, Shift, Ctrl 및 Alt 키의 상태와 마우스 단추의 상태에 따라 끌어서 놓기 작업을 종료하는 작업을 결정할 수 있습니다. 이 이벤트의 기본 처리기는 사용자가 Esc 키를 누르면 끌어서 놓기 작업을 취소하고, 마우스 단추를 놓으면 데이터를 놓습니다.
주의 |
---|
이러한 이벤트는 끌어서 놓기 작업 도중 계속해서 발생합니다.따라서 리소스를 많이 소모하는 작업은 이벤트 처리기에 포함하면 안 됩니다.예를 들어 GiveFeedback 이벤트가 발생할 때마다 새 커서를 만드는 대신 캐시된 커서를 사용할 수 있습니다. |
요소가 놓기 대상이 될 수 있도록 설정
놓기 대상이 되는 개체는 다음 작업을 수행합니다.
해당 개체가 올바른 놓기 대상이 되도록 지정
대상 위로 끌 때 끌기 소스에 응답
전송되는 데이터가 대상에서 받을 수 있는 형식인지 확인
놓인 데이터 처리
요소가 놓기 대상이 되도록 지정하려면 요소의 AllowDrop 속성을 true로 설정합니다. 그러면 해당 요소에 대해 놓기 대상 이벤트가 발생하므로 이 이벤트를 처리할 수 있습니다. 끌어서 놓기 작업 중 놓기 대상에 대해 발생하는 이벤트 시퀀스는 다음과 같습니다.
DragEnter 이벤트는 데이터를 놓기 대상의 경계로 끌 때 발생합니다. 일반적으로 이 이벤트를 처리하여 끌어서 놓기 작업의 결과를 미리 볼 수 있도록 합니다(응용 프로그램에 적절한 경우). DragEnter 이벤트에서 DragEventArgs.Effects 속성을 설정하면 안 됩니다. 그러면 DragOver 이벤트에서 이 속성을 덮어쓰게 됩니다.
다음 예제에서는 Ellipse 요소에 대한 DragEnter 이벤트 처리기를 보여 줍니다. 이 코드에서는 현재 Fill 브러시를 저장하여 끌어서 놓기 작업의 결과를 미리 봅니다. 그런 다음 GetDataPresent 메서드를 사용하여 타원 위로 끌고 있는 DataObject에 Brush로 변환할 수 있는 문자열 데이터가 포함되어 있는지 확인합니다. 포함되어 있으면 GetData 메서드를 사용하여 데이터가 추출됩니다. 추출된 데이터는 Brush로 변환되어 타원에 적용됩니다. 변경 내용은 DragLeave 이벤트 처리기에서 되돌려집니다. 데이터를 Brush로 변환할 수 없는 경우에는 아무 작업도 수행되지 않습니다.
DragOver 이벤트는 데이터를 놓기 대상 위로 끄는 동안 계속해서 발생합니다. 이 이벤트는 끌기 소스에 대한 GiveFeedback 이벤트와 쌍을 이룹니다. DragOver 이벤트 처리기에서는 일반적으로 GetDataPresent 및 GetData 메서드를 사용하여 전송되는 데이터가 놓기 대상에서 처리할 수 있는 형식인지 확인합니다. 사용자가 보조키를 눌렀는지 확인할 수도 있습니다. 일반적으로 이를 통해 사용자가 의도한 작업이 이동인지 복사인지 알 수 있습니다. 이러한 확인을 수행한 후에는 데이터를 놓을 때의 결과를 끌기 소스에 알리도록 DragEventArgs.Effects 속성을 설정합니다. 끌기 소스는 GiveFeedback 이벤트 인수에서 이 정보를 받아 사용자에게 피드백을 제공하도록 적절한 커서를 설정할 수 있습니다.
다음 예제에서는 Ellipse 요소에 대한 DragOver 이벤트 처리기를 보여 줍니다. 이 코드에서는 타원 위로 끌고 있는 DataObject에 Brush로 변환할 수 있는 문자열 데이터가 포함되어 있는지 확인합니다. 그러한 문자열 데이터가 포함되어 있으면 DragEventArgs.Effects 속성을 Copy로 설정합니다. 이는 끌기 소스에 데이터를 타원으로 복사할 수 있음을 나타냅니다. 데이터를 Brush로 변환할 수 없는 경우에는 DragEventArgs.Effects 속성이 None으로 설정됩니다. 이는 끌기 소스에 타원이 해당 데이터에 적절한 놓기 대상이 아님을 나타냅니다.
DragLeave 이벤트는 데이터를 대상의 경계에 놓지 않고 경계 밖으로 끌 때 발생합니다. DragEnter 이벤트 처리기에서 수행한 모든 작업을 취소하려면 이 이벤트를 처리합니다.
다음 예제에서는 Ellipse 요소에 대한 DragLeave 이벤트 처리기를 보여 줍니다. 이 코드에서는 DragEnter 이벤트 처리기에서 저장된 Brush를 타원에 적용하여 수행한 미리 보기를 취소합니다.
Drop 이벤트는 데이터를 놓기 대상 위에 놓을 때 발생합니다. 데이터 놓기는 기본적으로 마우스 단추를 놓을 때 수행됩니다. Drop 이벤트 처리기에서는 GetData 메서드를 사용하여 DataObject에서 전송 대상 데이터를 추출하고 응용 프로그램에 필요한 데이터 처리를 수행합니다. Drop 이벤트는 끌어서 놓기 작업을 종료합니다.
다음 예제에서는 Ellipse 요소에 대한 Drop 이벤트 처리기를 보여 줍니다. DragEnter 이벤트 처리기의 코드와 유사한 이 코드에서는 끌어서 놓기 작업의 결과를 적용합니다. 이 코드에서는 타원 위로 끌고 있는 DataObject에 Brush로 변환할 수 있는 문자열 데이터가 포함되어 있는지 확인합니다. 그러한 문자열 데이터가 포함되어 있으면 타원에 Brush가 적용됩니다. 데이터를 Brush로 변환할 수 없는 경우에는 아무 작업도 수행되지 않습니다.
참고 항목
참조
기타 리소스
변경 기록
날짜 |
변경 내용 |
이유 |
---|---|---|
2011년 4월 |
항목을 업데이트했습니다. |
고객 의견 |