2011-05-10 42 views
4

要解釋沒有圖像和無代碼的問題並不容易。對於那些有興趣的,我做了一個示例C#/ WPF項目,可以從下載http://rapidshare.com/files/461745095/02.WPFControlEvents.rarWPF中的MouseEnter和MouseLeave處理(使用VS2008和.net 3.5)未按預期工作

這是一個非常小的項目(45KB)。問題如下(對於扭曲的描述,我對此表示歉意):

「幻想」(而相當醜陋)按鈕包含一個堆棧面板,其中包含1)標籤,2)畫布3。 )兩(2)個同心橢圓,全部從左至右排列。

有一個用於堆棧面板的MouseEnter和MouseLeave事件處理程序,它在標題欄中顯示一條消息,指示鼠標是在堆疊面板上還是在其外面。

問題是:當鼠標懸停在標籤上(又包含在堆疊面板中)時,(正確)報告鼠標位於堆棧面板上。當鼠標移動到畫布上時(也包含在堆疊面板中),鼠標(錯誤地?)報告爲而不是在堆疊面板上,但是當鼠標向右移動一點時(通過兩個橢圓,這是在畫布上),鼠標被報告再次在堆疊面板上。

爲什麼當鼠標懸停在畫布上時,它被報告沒有超過堆棧面板,但是當鼠標懸停在橢圓上(畫在畫布上)時,它被報告在堆棧面板上。

謝謝您解決問題,

John。

+1

我沒有答案,爲什麼會出現這種情況,但實際的解決方法可能是使用網格來佈置Label和Ellipse對象,使用Margin屬性來定位兩個省略號。這可以避免嵌套的容器,這可能會導致行爲。 – 2011-05-10 16:04:52

+0

@丹:我試過你的建議。即使Canvas的背景被設置爲不透明(如CodeNaked下面所示),但使用網格並不會出現問題。謝謝。 – Hex440bx 2011-05-10 16:27:03

+0

@任何人可能會閱讀這個試圖理解/解決同樣的問題:只改變爲網格_seemed_解決了問題,因爲它使標籤佔據了網格的整個寬度。被擊中的標籤以及在畫布上方掩蓋了問題的持續存在。查看CodeNaked的最後(或接近尾聲)評論,以更好,更完整地解釋在這種情況下發生的事情。 – Hex440bx 2011-05-10 17:09:51

回答

2

您可能需要將畫布的背景設置爲透明。這將允許它「可測試」並報告鼠標懸停事件。

更多信息可以在here找到,但Canvas的默認背景爲空。

+0

@CodeNaked:這是一個很好的建議。將背景設置爲透明可消除問題。我仍然想知道是什麼導致了原始行爲,因爲當鼠標位於橢圓(不透明)時鼠標會報告在堆疊面板上,但鼠標懸停時沒有結束在未上漆的畫布上。 – Hex440bx 2011-05-10 16:19:57

+1

@ Hex440bx - 它在上面的鏈接中有點解釋,但是具有空背景有點像將IsHitTestVisible設置爲false。 IsHitTestVisible的區別影響任何後代(即你的橢圓),而空背景僅影響一個對象(即你的Canvas)。所以如果鼠標超過了橢圓,它的任何祖先都會將IsMouseOver設置爲true。當通過畫布時,它不會「接收」「空像素」的任何鼠標事件,所以祖先沒有將IsMouseOver設置爲true。 – CodeNaked 2011-05-10 16:25:09

+0

@CodeNaked:現在我明白了這是有道理的。感謝您的額外解釋和鏈接 - 非常有用。 – Hex440bx 2011-05-10 16:32:14