1. 程式人生 > >WPF,強制捕獲滑鼠事件,滑鼠移出控制元件外依然可以執行強制捕獲的滑鼠事件

WPF,強制捕獲滑鼠事件,滑鼠移出控制元件外依然可以執行強制捕獲的滑鼠事件

原文: WPF,強制捕獲滑鼠事件,滑鼠移出控制元件外依然可以執行強制捕獲的滑鼠事件

在WPF中,只有滑鼠位置在某個控制元件上的時候才會觸發該控制元件的滑鼠事件。
例如,有兩個控制元件都註冊了MouseDown和MouseUp事件,在控制元件1上按下滑鼠,不要放開,移動到控制元件2上再放開。
在這個過程中,控制元件1只會觸發MouseDown事件,而控制元件2則只會觸發MouseUp事件,滑鼠不在控制元件上他們就收不到對應的滑鼠事件。
同樣的如果某個控制元件註冊了MouseMove事件,當滑鼠移動到控制元件外之後,控制元件將不會接收到MouseMove事件。
但是在很多情況下我們需要在滑鼠移動到控制元件外之後還能接收滑鼠事件。例如按住滑鼠拖動,當滑鼠到了控制元件外,拖動操作依然可以繼續。
這些情況需要控制元件強制捕獲滑鼠,這就要用到UIElment 的CaptureMouse 函式和ReleaseMouseCapture 函式。
CaptureMouse 函式的作用是嘗試將滑鼠強制捕獲到控制元件,ReleaseMouseCapture 函式的作用是當控制元件具有滑鼠捕獲的話,則釋放該捕獲。



下面舉個例子,例如我們需要在一張圖片上通過滑鼠拖動畫一個矩形框,操作步驟分為:
1. 點選滑鼠左鍵,確定矩形的一個頂點P;
2. 按住滑鼠左鍵並拖動滑鼠,將滑鼠位置作為矩形中頂點P所屬的對角線的另外一個頂點,畫矩形;
3. 放開滑鼠左鍵,完成矩形繪製。
但是當滑鼠移動到圖片邊緣的時候,圖片接收不到滑鼠MouseMove和MouseUP事件,繪製過程就無法正常完成了。

為了解決這個問題,我們需要在MouseLeftButtonDown 事件的相應函式中加上如下程式碼
((UIElement)e.Source).CaptureMouse();
在MouseUp 事件的相應函式中加入
((UIElement)e.Source).ReleaseMouseCapture();
這樣,即使滑鼠在圖片外,我們也能繼續執行捕獲的滑鼠事件。

為了讓矩形不畫到圖片外,我們可以對矩形的邊框位置加上限制,矩形的兩個頂點必須限制:
    Point p = e.GetPosition(this.imageControl);
    p.X = Math.Max(0, p.X);
    p.Y = Math.Max(0, p.Y);
    p.X = Math.Min(this.imageControl.Width, p.X);
    p.Y = Math.Min(this.imageControl.Height, p.Y);
在使用了CaptureMouse 函式將滑鼠強制捕獲到控制元件後,一定不要忘記在完成操作後使用ReleaseMouseCapture 函式釋放捕獲,

否則在其他控制元件上進行滑鼠操作依然會觸發捕獲滑鼠的控制元件的滑鼠事件,而非原本滑鼠點選的控制元件的滑鼠事件響應函式。