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

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

move posit max use con mouse 鼠標移動 如果 強制

在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 函數釋放捕獲,

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

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