끌어서 놓기 개요

업데이트: 2007년 11월

이 항목에서는 WPF(Windows Presentation Foundation) 응용 프로그램에서 제공하는 끌어서 놓기 기능에 대한 개요를 설명합니다. 일반적으로 끌어서 놓기는 마우스나 기타 포인팅 장치를 사용하여 하나 이상의 개체를 선택하고 이러한 개체를 UI의 원하는 놓기 대상 위로 끌어서 놓는 작업을 포함하는 UI(사용자 인터페이스) 상호 작용의 한 방법입니다.

이 항목에는 다음 단원이 포함되어 있습니다.

  • WPF의 끌어서 놓기 지원
  • 데이터 및 데이터 개체
  • 끌어서 놓기 이벤트
  • 데이터 개체 작업
  • 관련 항목

WPF의 끌어서 놓기 지원

일반적으로 끌어서 놓기 작업은 두 개의 부분으로 구성되는데 하나는 끌어오는 개체가 시작되는 끌기 소스이고 다른 하나는 끌어온 개체를 받는 놓기 대상입니다. 끌기 소스 및 놓기 대상은 동일한 응용 프로그램이나 다른 응용 프로그램이 될 수 있습니다.

끌어서 놓기를 사용하여 조작할 수 있는 개체의 형식과 수는 상황에 따라 달라집니다. 끌어서 놓기 작업을 통해 조작되는 더 일반적인 개체는 하나 이상의 파일 또는 폴더와 선택된 콘텐츠입니다. 끌어서 놓기 작업 도중에 수행되는 특정 작업은 응용 프로그램과 관련되며 일반적으로 컨텍스트에 의해 결정됩니다. 예를 들어 선택한 파일을 동일한 저장 장치의 한 폴더에서 다른 폴더로 끌면 기본적으로 파일이 이동하지만 UNC(범용 명명 규칙) 공유에서 로컬 폴더로 파일을 끌면 기본적으로 파일이 복사됩니다. WPF에서 제공되는 끌어서 놓기 기능은 다양한 끌어서 놓기 시나리오를 지원하기 위해 매우 유연하게 사용자 지정할 수 있도록 디자인되었습니다. 끌어서 놓기는 단일 응용 프로그램 내에서 또는 다른 응용 프로그램 간에 개체 조작을 지원합니다. 즉, WPF 응용 프로그램과 다른 Windows 응용 프로그램 간의 끌어서 놓기도 완전히 지원됩니다. 끌어서 놓기는 더 일반적인 데이터 전송 영역의 일부입니다. 끌어서 놓기 외에도 복사 및 붙여넣기 작업을 위해 시스템 클립보드를 사용하는 것이 데이터 전송에 포함됩니다.

보안 정보: OLE 끌어서 놓기는 인터넷 영역에 있는 동안 작동하지 않습니다.

데이터 및 데이터 개체

끌어서 놓기 작업의 일부로 전송되는 데이터는 데이터 개체에 저장됩니다. 개념적으로 보면 데이터 개체는 다음 중 하나 이상의 쌍으로 구성됩니다.

  • 실제 데이터가 포함된 Object

  • 해당 데이터 형식 식별자

데이터 자체는 기본 Object로 나타낼 수 있는 모든 것으로 구성될 수 있습니다. 해당 데이터 형식은 데이터의 형식에 대한 힌트를 제공하는 문자열 또는 Type입니다. 데이터 개체에는 여러 데이터-(데이터 형식) 쌍을 호스팅하는 것이 지원됩니다. 따라서 단일 데이터 개체가 여러 형식의 데이터를 제공할 수 있습니다.

모든 데이터 개체는 데이터 전송을 사용 가능 및 용이하게 하는 다음 표준 메서드 집합을 제공하는 IDataObject 인터페이스를 구현해야 합니다.

메서드

요약

GetData

지정된 데이터 형식의 데이터 개체를 검색합니다.

GetDataPresent

지정된 형식의 데이터가 있거나 지정된 형식으로 변환될 수 있는지 확인합니다.

GetFormats

이 데이터 개체의 데이터가 저장되거나 변환될 수 있는 형식 목록을 반환합니다.

SetData

이 데이터 개체에 지정된 데이터를 저장합니다.

WPF는 DataObject 클래스에서 IDataObject의 기본 구현을 제공합니다. 스톡 DataObject 클래스는 대부분의 일반 데이터 전송 시나리오에 충분합니다.

WPF와 함께 제공되는 미리 정의된 데이터 형식에 대한 자세한 내용은 DataFormats 클래스 참조 항목을 참조하십시오.

일반적으로 데이터 개체에는 데이터를 추출하는 동안 한 형식으로 저장된 데이터를 다른 형식으로 자동 변환하는 기능이 포함되어 있습니다. 이 기능을 자동 변환이라고 합니다.

데이터 개체에서 사용할 수 있는 데이터 형식을 쿼리할 경우 GetFormats(Boolean) 또는 GetDataPresent(String, Boolean) 메서드를 호출하고 autoConvert 매개 변수를 false로 지정하여 자동 변환할 수 있는 데이터 형식을 네이티브 데이터 형식으로 필터링할 수 있습니다. SetData(String, Object, Boolean) 메서드를 사용하여 데이터를 데이터 개체에 추가할 경우 autoConvert 매개 변수를 false로 설정하여 데이터의 자동 변환을 방지할 수 있습니다.

끌어서 놓기 이벤트

끌어서 놓기 작업은 이벤트 구동 모델을 지원합니다. 끌기 소스 및 놓기 대상은 표준 이벤트 집합을 사용하여 끌어서 작업을 처리합니다. 다음 표에는 표준 끌어서 놓기 이벤트가 요약되어 있습니다.

끌기 소스 이벤트

이벤트

요약

GiveFeedback

이 이벤트는 끌어서 놓기 작업이 시작될 때 발생하며 놓기 대상에서 피드백 정보를 끌기 소스에 보낼 수 있게 합니다. 마우스 포인터 모양을 동적으로 조정하여 사용자에게 피드백을 제공하기 위해 일반적으로 끌기 소스에서 이 피드백이 사용됩니다. 이것은 버블링 이벤트입니다.

QueryContinueDrag

이 이벤트는 끌어서 놓기 작업 도중 키보드 또는 마우스 단추 상태가 변경될 때 발생하며 놓기 소스에서는 이를 통해 키/단추 상태에 따라 끌어서 놓기 작업을 취소할 수 있습니다. 이것은 버블링 이벤트입니다.

PreviewGiveFeedback

GiveFeedback의 터널링 버전

PreviewQueryContinueDrag

QueryContinueDrag의 터널링 버전

놓기 대상 이벤트

이벤트

요약

DragEnter

이 이벤트는 개체를 놓기 대상의 경계로 끌 때 발생합니다. 이것은 버블링 이벤트입니다.

DragLeave

이 이벤트는 개체를 놓기 대상의 경계 밖으로 끌 때 발생합니다. 이것은 버블링 이벤트입니다.

DragOver

이 이벤트는 개체를 놓기 대상의 경계 내에서 끌(이동할) 때 발생합니다. 이것은 버블링 이벤트입니다.

Drop

이 이벤트는 개체를 놓기 대상에 놓을 때 발생합니다. 이것은 버블링 이벤트입니다.

PreviewDragEnter

Tunneling version of DragEnter.

PreviewDragLeave

DragLeave의 터널링 버전

PreviewDragOver

DragOver의 터널링 버전

PreviewDrop

Drop의 터널링 버전

데이터 개체 작업

이 단원에서는 데이터 개체 만들기 및 작업을 위한 일반적인 기술에 대해 설명합니다.

DataObject 생성자 사용

DataObject 클래스는 새 DataObject 인스턴스를 단일 데이터-(데이터 형식) 쌍으로 쉽게 채울 수 있게 하는 여러 오버로드된 생성자를 제공합니다.

다음 예제 코드에서는 새 데이터 개체를 만들고 오버로드된 생성자 중 하나(DataObject(String, Object))를 사용하여 문자열 및 지정된 데이터 형식으로 데이터 개체를 초기화합니다. 이 경우 데이터 형식은 문자열로 지정되며 DataFormats 클래스는 미리 정의된 형식 문자열 집합을 제공합니다. 저장된 데이터는 기본적으로 자동 변환됩니다.

string stringData = "Some string data to store...";
string dataFormat = DataFormats.UnicodeText;
DataObject dataObject = new DataObject(dataFormat, stringData);

데이터 개체를 만드는 추가 코드 예제는 방법: 데이터 개체 만들기를 참조하십시오.

데이터를 여러 형식으로 저장

단일 데이터 개체에서 데이터를 여러 형식으로 저장할 수 있습니다. 단일 데이터 개체에서 여러 데이터 형식을 전략적으로 사용하면 단일 데이터 형식만 표시할 수 있는 경우보다 다양한 놓기 대상에서 데이터 개체를 사용할 수 있습니다. 일반적으로 끌기 소스는 잠재적 놓기 대상에서 사용할 수 있는 데이터 형식과 무관해야 합니다.

다음 예제에서는 SetData(String, Object) 메서드를 사용하여 데이터를 여러 형식으로 데이터 개체에 추가하는 방법을 보여 줍니다.

DataObject dataObject = new DataObject();
string sourceData = "Some string data to store...";

// Encode the source string into Unicode byte arrays.
byte[] unicodeText = Encoding.Unicode.GetBytes(sourceData); // UTF-16
byte[] utf8Text = Encoding.UTF8.GetBytes(sourceData);
byte[] utf32Text = Encoding.UTF32.GetBytes(sourceData);

// The DataFormats class does not provide data format fields for denoting
// UTF-32 and UTF-8, which are seldom used in practice; the following strings 
// will be used to identify these "custom" data formats.
string utf32DataFormat = "UTF-32";
string utf8DataFormat  = "UTF-8";

// Store the text in the data object, letting the data object choose
// the data format (which will be DataFormats.Text in this case).
dataObject.SetData(sourceData);
// Store the Unicode text in the data object.  Text data can be automatically
// converted to Unicode (UTF-16 / UCS-2) format on extraction from the data object; 
// Therefore, explicitly converting the source text to Unicode is generally unnecessary, and
// is done here as an exercise only.
dataObject.SetData(DataFormats.UnicodeText, unicodeText);
// Store the UTF-8 text in the data object...
dataObject.SetData(utf8DataFormat, utf8Text);
// Store the UTF-32 text in the data object...
dataObject.SetData(utf32DataFormat, utf32Text);

데이터 개체에서 사용할 수 있는 형식 쿼리

단일 데이터 개체가 데이터 형식을 개수에 상관없이 포함할 수 있으므로 데이터 개체에는 사용할 수 있는 데이터 형식 목록을 검색하는 기능이 포함되어 있습니다.

다음 예제 코드에서는 GetFormats 오버로드를 사용하여 데이터 개체에서 기본적으로 및 자동 변환을 통해 사용할 수 있는 모든 데이터 형식을 나타내는 문자열 배열을 가져옵니다.

DataObject dataObject = new DataObject("Some string data to store...");

// Get an array of strings, each string denoting a data format
// that is available in the data object.  This overload of GetDataFormats
// returns all available data formats, native and auto-convertible.
string[] dataFormats = dataObject.GetFormats();

// Get the number of data formats present in the data object, including both
// auto-convertible and native data formats.
int numberOfDataFormats = dataFormats.Length;

// To enumerate the resulting array of data formats, and take some action when
// a particular data format is found, use a code structure similar to the following.
foreach (string dataFormat in dataFormats)
{
    if (dataFormat == DataFormats.Text)
    {
        // Take some action if/when data in the Text data format is found.
        break;
    }
    else if(dataFormat == DataFormats.StringFormat)
    {
        // Take some action if/when data in the string data format is found.
        break;
    }
}

데이터 개체에서 사용할 수 있는 데이터 형식을 쿼리하는 추가 코드 예제는 방법: 데이터 개체의 데이터 형식 나열을 참조하십시오. 데이터 개체에서 특정 데이터 형식의 존재를 쿼리하는 예제는 방법: 데이터 개체에 데이터 형식이 있는지 확인을 참조하십시오.

데이터 개체에서 데이터 검색

데이터 개체에서 특정 형식의 데이터를 검색하는 작업에서는 단순히 GetData 메서드 중 하나를 호출하고 원하는 데이터 형식을 지정합니다. GetDataPresent 메서드 중 하나를 사용하여 특정 데이터 형식의 존재를 확인할 수 있습니다. GetDataObject의 데이터를 반환합니다. 데이터 형식에 따라 이 개체는 형식별 컨테이너에 캐스팅될 수 있습니다.

다음 예제 코드에서는 GetDataPresent(String) 오버로드를 사용하여 지정된 데이터 형식을 사용할 수 있는지(기본적으로 또는 자동 변환에 의해) 여부를 먼저 확인합니다. 지정된 형식을 사용할 수 있는 경우 이 예제는 GetData(String) 메서드를 사용하여 데이터를 검색합니다.

DataObject dataObject = new DataObject("Some string data to store...");

string desiredFormat = DataFormats.UnicodeText;
byte[] data = null;

// Use the GetDataPresent method to check for the presence of a desired data format.
// This particular overload of GetDataPresent looks for both native and auto-convertible 
// data formats.
if (dataObject.GetDataPresent(desiredFormat))
{
    // If the desired data format is present, use one of the GetData methods to retrieve the
    // data from the data object.
    data = dataObject.GetData(desiredFormat) as byte[];
}

데이터 개체에서 데이터를 검색하는 추가 코드 예제는 방법: 특정 데이터 형식의 데이터 검색을 참조하십시오.

데이터 개체에서 데이터 제거

데이터를 데이터 개체에서 직접 제거할 수 없습니다. 데이터 개체에서 데이터를 효율적으로 제거하려면 제안된 다음 단계를 수행합니다.

 

  1. 보유할 데이터만 포함할 새 데이터 개체를 만듭니다.

  2. 이전 데이터 개체에서 새 데이터 개체로 원하는 데이터를 "복사"합니다. 데이터를 복사하려면 GetData 메서드 중 하나를 사용하여 원시 데이터를 포함하는 Object를 검색한 다음 SetData 메서드 중 하나를 사용하여 데이터를 새 데이터 개체에 추가합니다.

  3. 이전 데이터 개체를 새 데이터 개체로 바꿉니다.

 

참고

SetData 메서드는 데이터를 단지 데이터 개체에 추가할 뿐이여 데이터 및 데이터 형식이 이전 호출과 같은 경우에도 데이터를 바꾸지 않습니다. 동일한 데이터 및 데이터 형식에 대해 SetData를 두 번 호출하면 데이터-데이터 형식이 데이터 개체에 두 번 존재하게 됩니다.

참고 항목

참조

Clipboard

기타 리소스

끌어서 놓기 샘플

끌어서 놓기 방법 항목

끌어서 놓기