Widziałem to w środowisku Turbo C ++ firmy Borland , ale nie jestem pewien, jak to zrobić w przypadku aplikacji C #, nad którą pracuję. Czy są jakieś sprawdzone metody lub gotówki?
c#
winforms
drag-and-drop
Uwe Keim
źródło
źródło
Odpowiedzi:
Niektóre przykładowy kod:
źródło
io.File
(string[])
rzutowanie jest bezpieczne dla dowolnegoFileDrop
sformatowanego zrzutu? To znaczy, czy można wygenerować takiFileDrop
, który spowoduje niezgodny z prawem wyjątek rzutowaniastring[]
? Mam problem z ustaleniem tego na podstawie dokumentów .Pamiętaj o prawach bezpieczeństwa systemu Windows vista / Windows 7 - jeśli korzystasz z programu Visual Studio jako administrator, nie będziesz mógł przeciągać plików z okna eksploratora innego niż administrator do swojego programu po uruchomieniu go z poziomu programu Visual Studio. Wydarzenia związane z przeciąganiem nawet się nie uruchomią! Mam nadzieję, że pomoże to komuś innemu nie marnować godzin życia ...
źródło
W formularzach Windows ustaw właściwość AllowDrop formantu, a następnie nasłuchuj zdarzenia DragEnter i DragDrop.
Gdy
DragEnter
zdarzenie zostanie uruchomione, ustaw argument naAllowedEffect
coś innego niż brak (npe.Effect = DragDropEffects.Move
.).Gdy
DragDrop
wydarzenie się uruchomi , otrzymasz listę ciągów znaków. Każdy ciąg jest pełną ścieżką do usuwanego pliku.źródło
Musisz być świadomy gotcha. Każda klasa przekazywana jako obiekt DataObject w operacji przeciągania / upuszczania musi mieć możliwość szeregowania. Więc jeśli spróbujesz przekazać obiekt, który nie działa, upewnij się, że można go przekształcić do postaci szeregowej, ponieważ prawie na pewno jest to problem. Kilka razy mnie to złapało!
źródło
Jeszcze jedna gotcha:
Kod frameworku wywołujący zdarzenia Drag pochłania wszystkie wyjątki. Możesz myśleć, że Twój kod zdarzenia działa płynnie, podczas gdy tryskają wyjątkami w każdym miejscu. Nie możesz ich zobaczyć, ponieważ kradnie je platforma.
Dlatego zawsze umieszczam try / catch w tych procedurach obsługi zdarzeń, po prostu wiem, czy zgłaszają jakieś wyjątki. Zwykle umieszczam Debugger.Break (); w części catch.
Przed wydaniem, po przetestowaniu, jeśli wszystko wydaje się zachowywać, usuwam je lub zastępuję prawdziwą obsługą wyjątków.
źródło
Innym powszechnym problemem jest myślenie, że możesz zignorować zdarzenia Form DragOver (lub DragEnter). Zwykle używam zdarzenia DragOver formularza do ustawienia Dozwolonego efektu, a następnie zdarzenia DragDrop określonej kontrolki do obsługi upuszczonych danych.
źródło
Oto coś, czego użyłem do upuszczania plików i / lub folderów pełnych plików. W moim przypadku szukałem
*.dwg
tylko pliki i postanowiłem uwzględnić wszystkie podfoldery.fileList
jestIEnumerable
podobny lub podobny W moim przypadku był związany z kontrolką WPF ...Zobacz https://stackoverflow.com/a/19954958/492 aby uzyskać szczegółowe informacje na temat tej sztuczki.
Uchwyt zrzutu ...
źródło
Rozwiązanie Judah Himango i Hansa Passanta jest dostępne w Designer (obecnie używam VS2015):
źródło
Możesz wdrożyć Drag & Drop w WinForms i WPF.
Powinieneś dodać zdarzenie mousemove:
Powinieneś dodać zdarzenie DragDrop:
private void YourElementControl_DragDrop (nadawca obiektu, DragEventArgs e)
Źródło z pełnym kodem .
źródło