WPF,强制捕获鼠标事件,鼠标移出控件外依然可以执行强制捕获的鼠标事件
在WPF中,只有鼠標(biāo)位置在某個(gè)控件上的時(shí)候才會(huì)觸發(fā)該控件的鼠標(biāo)事件。
例如,有兩個(gè)控件都注冊(cè)了MouseDown和MouseUp事件,在控件1上按下鼠標(biāo),不要放開,移動(dòng)到控件2上再放開。
在這個(gè)過程中,控件1只會(huì)觸發(fā)MouseDown事件,而控件2則只會(huì)觸發(fā)MouseUp事件,鼠標(biāo)不在控件上他們就收不到對(duì)應(yīng)的鼠標(biāo)事件。
同樣的如果某個(gè)控件注冊(cè)了MouseMove事件,當(dāng)鼠標(biāo)移動(dòng)到控件外之后,控件將不會(huì)接收到MouseMove事件。
但是在很多情況下我們需要在鼠標(biāo)移動(dòng)到控件外之后還能接收鼠標(biāo)事件。例如按住鼠標(biāo)拖動(dòng),當(dāng)鼠標(biāo)到了控件外,拖動(dòng)操作依然可以繼續(xù)。
這些情況需要控件強(qiáng)制捕獲鼠標(biāo),這就要用到UIElment 的CaptureMouse 函數(shù)和ReleaseMouseCapture 函數(shù)。
CaptureMouse 函數(shù)的作用是嘗試將鼠標(biāo)強(qiáng)制捕獲到控件,ReleaseMouseCapture 函數(shù)的作用是當(dāng)控件具有鼠標(biāo)捕獲的話,則釋放該捕獲。
下面舉個(gè)例子,例如我們需要在一張圖片上通過鼠標(biāo)拖動(dòng)畫一個(gè)矩形框,操作步驟分為:
1. 點(diǎn)擊鼠標(biāo)左鍵,確定矩形的一個(gè)頂點(diǎn)P;
2. 按住鼠標(biāo)左鍵并拖動(dòng)鼠標(biāo),將鼠標(biāo)位置作為矩形中頂點(diǎn)P所屬的對(duì)角線的另外一個(gè)頂點(diǎn),畫矩形;
3. 放開鼠標(biāo)左鍵,完成矩形繪制。
但是當(dāng)鼠標(biāo)移動(dòng)到圖片邊緣的時(shí)候,圖片接收不到鼠標(biāo)MouseMove和MouseUP事件,繪制過程就無法正常完成了。
為了解決這個(gè)問題,我們需要在MouseLeftButtonDown 事件的相應(yīng)函數(shù)中加上如下代碼
((UIElement)e.Source).CaptureMouse();
在MouseUp 事件的相應(yīng)函數(shù)中加入
((UIElement)e.Source).ReleaseMouseCapture();
這樣,即使鼠標(biāo)在圖片外,我們也能繼續(xù)執(zhí)行捕獲的鼠標(biāo)事件。
為了讓矩形不畫到圖片外,我們可以對(duì)矩形的邊框位置加上限制,矩形的兩個(gè)頂點(diǎn)必須限制:
??? 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 函數(shù)將鼠標(biāo)強(qiáng)制捕獲到控件后,一定不要忘記在完成操作后使用ReleaseMouseCapture 函數(shù)釋放捕獲,
否則在其他控件上進(jìn)行鼠標(biāo)操作依然會(huì)觸發(fā)捕獲鼠標(biāo)的控件的鼠標(biāo)事件,而非原本鼠標(biāo)點(diǎn)擊的控件的鼠標(biāo)事件響應(yīng)函數(shù)。
轉(zhuǎn)載于:https://www.cnblogs.com/qiantao/p/9429831.html
總結(jié)
以上是生活随笔為你收集整理的WPF,强制捕获鼠标事件,鼠标移出控件外依然可以执行强制捕获的鼠标事件的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android:一个线程玩转商品列表所有
- 下一篇: 算法导论——基本的图算法