2011-04-20 73 views
1

嘿;我有一個用戶控件以下視覺hyerarchy:無法處理PreviewMouseDown

網 - >帆布 - > MyContentControl

MyContentControl是自ContentControl派生的類,頂部有一個長方形的裝飾器,這是爲了更容易地點擊某些對象(增加命中測試區域)。裝飾者始終在場,但背景透明。

我希望看到PreviewMouseDown事件在我從UserControl的代碼隱藏中點擊MyContentControl時引發,但事件似乎沒有在那裏引發,僅在裝飾者級別。

事件在adorner級別處理,但e.IsHandled未設置爲true,所以它應該繼續冒泡或隧道。從我所讀到的,PreviewMouseDown是隧道,和IIRC,它應該先在用戶控件中提出。

我錯過了什麼嗎?

謝謝。

回答

3

既然你描述的實際視覺樹看起來像這樣的結構:

Window 
-> Grid 
    -> Canvas 
     -> MyContentControl 
-> AdornerLayer 
    -> MyContentControlAdorner 

正如你看到的,你的裝飾器(MyContentControlAdorner)位於樹比你的自定義控件的不同分支。這是因爲裝飾者被放置在一個叫做AdornerLayer的特殊元素中。這種AdornerLayer通常直接位於頂層元素內(如WindowPage)。

因此,考慮到所有這些,應該清楚,如果在裝飾者中引發事件,它將通過以下路徑進行隧道傳輸:Window -> AronerLayer -> MyContentControlAdorner

這就是說,你不能處理位於不同子樹中的兩個元素上的鼠標事件(即使它們被放置在另一個子樹上面)。

+0

謝謝,現在已經很清楚了。 – 2011-04-20 19:38:43