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 函數釋放捕獲,
否則在其他控件上進行鼠標操作依然會觸發捕獲鼠標的控件的鼠標事件,而非原本鼠標點擊的控件的鼠標事件響應函數。
轉載于:https://www.cnblogs.com/qiantao/p/9429831.html
總結
以上是生活随笔為你收集整理的WPF,强制捕获鼠标事件,鼠标移出控件外依然可以执行强制捕获的鼠标事件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android:一个线程玩转商品列表所有
- 下一篇: asp.net ajax控件工具集 Au