Moje pytanie jest 2-krotne i mam nadzieję, że istnieją łatwiejsze rozwiązania dla obu zapewniane przez WPF, a nie standardowe rozwiązania z WinForms (które dostarczył Christophe Geers, zanim zrobiłem to wyjaśnienie).
Po pierwsze, czy istnieje sposób na umożliwienie przeciągania okna bez przechwytywania i przetwarzania zdarzeń kliknięcia i przeciągnięcia? Chodzi mi o to, że okno można przeciągać za pomocą paska tytułu, ale jeśli ustawię okno tak, aby go nie miało i nadal chcę móc go przeciągać, czy istnieje sposób, aby jakoś przekierować zdarzenia do tego, co obsługuje przeciąganie paska tytułu ?
Po drugie, czy istnieje sposób na zastosowanie procedury obsługi zdarzeń do wszystkich elementów w oknie? Tak jak w, ustaw okno do przeciągania bez względu na to, który element kliknie i przeciągnie użytkownik. Oczywiście bez ręcznego dodawania handlera do każdego elementu. Po prostu zrób to raz gdzieś?
źródło
MouseLeftButtonDown
wydarzenia, zamiast sprawdzać pliki .cs?MouseLeftButtonDown
ma strategię routingu bezpośredniego, aMouseDown
strategię routingu bulgotania. Zobacz sekcję uwag na stronie MSDN dla MouseLeftButtonDown, aby uzyskać więcej informacji i kilka dodatkowych rzeczy, o których należy pamiętać, jeśli zamierzasz używaćMouseLeftButtonDown
overMouseDown
.jeśli formularz wpf musi być przeciągany bez względu na to, gdzie został kliknięty, prostym obejściem jest użycie delegata do wywołania metody DragMove () na zdarzeniu onload systemu Windows lub zdarzeniu ładowania siatki
źródło
DragMove
można go wywołać tylko wtedy, gdy główny przycisk myszy jest wciśnięty.Czasami nie mamy dostępu
Window
, np. Jeśli korzystamyDevExpress
, wszystko co jest dostępne to plikUIElement
.Krok 1: Dodaj dołączoną właściwość
Rozwiązaniem jest:
MouseMove
wydarzeń;Window
;.DragMove()
do naszego nowo odkrytegoWindow
.Kod:
Krok 2: Dodaj dołączoną właściwość do dowolnego elementu, aby przeciągnąć okno
Użytkownik może przeciągnąć całe okno klikając na konkretny element, jeśli dodamy taką załączoną właściwość:
Dodatek A: Opcjonalny przykład zaawansowany
W tym przykładzie z DevExpress zastępujemy pasek tytułu okna dokowanego naszym własnym szarym prostokątem, a następnie upewniamy się, że jeśli użytkownik kliknie i przeciągnie szarego prostokąta, okno będzie się przeciągać normalnie:
Zastrzeżenie: Ja nie związany z DevExpress . Ta technika będzie działać z dowolnym elementem użytkownika, w tym standardowym WPF lub Telerik (inny dobry dostawca biblioteki WPF).
źródło
W niektórych przypadkach rzuca wyjątek (np. Jeśli w oknie masz również klikalny obraz, który po kliknięciu otwiera okno komunikatu. Po wyjściu z okna komunikatu pojawi się błąd). Bezpieczniej jest użyć
Więc masz pewność, że lewy przycisk jest wciśnięty w tym momencie.
źródło
e.LeftButton
zamiastMouse.LeftButton
specjalnie używać przycisku związanego z argumentami zdarzenia, mimo że prawdopodobnie nie będzie to miało znaczenia.Formularz można przeciągać i upuszczać, klikając w dowolnym miejscu formularza, a nie tylko na pasku tytułu. Jest to przydatne, jeśli masz formularz bez obramowania.
W tym artykule na CodeProject przedstawiono jedno możliwe rozwiązanie do zaimplementowania tego:
http://www.codeproject.com/KB/cs/DraggableForm.aspx
Zasadniczo tworzony jest element potomny typu Form, w którym obsługiwane są zdarzenia myszy w dół, w górę i ruch.
A oto podobne rozwiązanie wyjaśnione w samouczku wideo:
http://www.youtube.com/watch?v=tJlY9aX73Vs
Nie pozwoliłbym na przeciąganie formularza, gdy użytkownik kliknie kontrolkę we wspomnianym formularzu. Użytkownicy uzyskują różne wyniki po kliknięciu różnych elementów sterujących. Kiedy mój formularz nagle zaczyna się poruszać, ponieważ kliknąłem pole listy, przycisk, etykietę ... itd. to byłoby mylące.
źródło
Jak już wspomniano w @ fjch1997 , wygodnie jest zaimplementować zachowanie. Tu jest logika rdzenia jest taki sam jak w @ loi.efy za odpowiedź :
Stosowanie:
źródło
To wszystko jest potrzebne!
źródło
Najbardziej przydatna metoda, zarówno dla WPF, jak i formularza Windows, przykład WPF:
źródło
źródło
źródło