나는 이것이 Borland의 Turbo C ++ 환경 에서 수행되는 것을 보았지만 현재 작업중 인 C # 응용 프로그램에서 어떻게 해야하는지 잘 모르겠습니다. 모범 사례 또는주의해야 할 사항이 있습니까?
답변
일부 샘플 코드 :
public partial class Form1 : Form {
public Form1() {
InitializeComponent();
this.AllowDrop = true;
this.DragEnter += new DragEventHandler(Form1_DragEnter);
this.DragDrop += new DragEventHandler(Form1_DragDrop);
}
void Form1_DragEnter(object sender, DragEventArgs e) {
if (e.Data.GetDataPresent(DataFormats.FileDrop)) e.Effect = DragDropEffects.Copy;
}
void Form1_DragDrop(object sender, DragEventArgs e) {
string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
foreach (string file in files) Console.WriteLine(file);
}
}
답변
Windows Vista / Windows 7 보안 권한을 알고 있어야합니다. Visual Studio를 관리자로 실행중인 경우 Visual Studio 내에서 실행할 때 비 관리자 탐색기 창에서 프로그램으로 파일을 끌어 올 수 없습니다. 드래그 관련 이벤트는 시작되지 않습니다! 나는 이것이 다른 누군가가 그들의 삶의 시간을 낭비하지 않도록 도와주기를 희망합니다 …
답변
Windows Forms에서 컨트롤의 AllowDrop 속성을 설정 한 다음 DragEnter 이벤트와 DragDrop 이벤트를 수신합니다.
하면 DragEnter
이벤트가 발생이 설정 인수입니다 AllowedEffect
없음 (예 이외의 다른 e.Effect = DragDropEffects.Move
).
때 DragDrop
이벤트가 화재, 당신은 문자열 목록을 얻을 것이다. 각 문자열은 삭제되는 파일의 전체 경로입니다.
답변
문제에 대해 알고 있어야합니다. 끌어서 놓기 작업에서 DataObject 로 전달하는 모든 클래스는 직렬화 가능해야합니다. 따라서 개체를 시도하여 전달 했는데도 작동하지 않는 경우 문제가 될 수 있으므로 직렬화 할 수 있는지 확인하십시오. 이것은 몇 번 나에게 걸렸다!
답변
또 다른 문제 :
드래그 이벤트를 호출하는 프레임 워크 코드는 모든 예외를 삼킨다. 이벤트 코드가 원활하게 실행되는 동안 모든 곳에서 예외가 발생한다고 생각할 수 있습니다. 프레임 워크가 훔치기 때문에 볼 수 없습니다.
그렇기 때문에 항상 이러한 이벤트 핸들러에 try / catch를 넣습니다. 예외가 발생하는지 알고 있습니다. 나는 보통 Debugger.Break (); 캐치 부분에서.
릴리스 전, 테스트 후 모든 것이 작동하는 것 같으면이를 실제 예외 처리로 제거하거나 교체합니다.
답변
또 다른 일반적인 문제는 Form DragOver (또는 DragEnter) 이벤트를 무시할 수 있다고 생각하는 것입니다. 일반적으로 폼의 DragOver 이벤트를 사용하여 AllowedEffect를 설정 한 다음 특정 컨트롤의 DragDrop 이벤트를 사용하여 삭제 된 데이터를 처리합니다.
답변
다음은 파일로 가득 찬 파일 및 / 또는 폴더를 삭제하는 데 사용한 것입니다. 필자의 경우 *.dwg
파일 만 필터링하고 모든 하위 폴더를 포함하도록 선택했습니다.
fileList
이다 IEnumerable
또는 나의 경우와 유사한 WPF 컨트롤에 바인딩했습니다 …
var fileList = (IList)FileList.ItemsSource;
해당 트릭에 대한 자세한 내용은 https://stackoverflow.com/a/19954958/492 를 참조 하십시오 .
드롭 핸들러 …
private void FileList_OnDrop(object sender, DragEventArgs e)
{
var dropped = ((string[])e.Data.GetData(DataFormats.FileDrop));
var files = dropped.ToList();
if (!files.Any())
return;
foreach (string drop in dropped)
if (Directory.Exists(drop))
files.AddRange(Directory.GetFiles(drop, "*.dwg", SearchOption.AllDirectories));
foreach (string file in files)
{
if (!fileList.Contains(file) && file.ToLower().EndsWith(".dwg"))
fileList.Add(file);
}
}