2016-01-03 17 views
5

Używam WindowStyle=None do usuwania granicy okna WPF. W aktach MainWindow.xaml.cs Właśnie dodaje następujący wiersz do konstruktora:Przeciągalne okno WPF bez ramki

this.MouseLeftButtonDown += delegate { this.DragMove(); }; 

To nieco działa i pozwala mi przeciągnąć okno wokół gdziekolwiek lewym przyciskiem wewnątrz MainWindow, tak długo jak nie jest na żadnym kontrola. Ponieważ tam właśnie dostaję problemy. Mam pole tekstowe, które zajmuje całą przestrzeń wewnątrz okna i tak szybko, jak to zrobię, nie mogę już przesuwać okna po kliknięciu lewym klawiszem myszy w polu tekstowym.

Jak sprawić, aby okno się poruszało, gdy użytkownik kliknie w okno i przeciągnie myszą, niezależnie od tego, jaką kontrolę uderza użytkownik?

A może prostsze, jak przenieść okno, gdy użytkownik kliknie i przeciągnie wewnątrz pola tekstowego?

Odpowiedz

3

Użyj tunelowanego zdarzenia MouseDown, tj. Zdarzenia PreviewMouseLeftButtonDown okna. Zapewni to, że impreza odbywa się zarówno w oknie i jej dziecko kontroluje:

this.PreviewMouseLeftButtonDown += (s, e) => DragMove(); 

Można również dodać zdarzenie do TextBox ręcznie:

textBox.MouseDown += (s, e) => DragMove(); 

Ale:

Robienie tego, co chcesz ma swoje nieodłączne problemy. Nie pozwoli ci wybrać tekstu w TextBox. Istnieje obejście - użyj wejście Key + MouseDrag tak:

bool isKeyPressed = false; 

public MainWindow() 
{ 
    InitializeComponent(); 
    this.PreviewKeyDown += (s1, e1) => { if (e1.Key == Key.LeftCtrl) isKeyPressed = true; }; 
    this.PreviewKeyUp += (s2, e2) => { if (e2.Key == Key.LeftCtrl) isKeyPressed = false; }; 
    this.PreviewMouseLeftButtonDown += (s, e) => { if (isKeyPressed) DragMove(); }; 
} 
+0

Lubię to rozwiązanie, chociaż wymaga ono trzymać ctrl, aby przesunąć okno dookoła. To ma dla mnie sens. –