2009年9月18日 星期五

在WPF中滑鼠事件(Event)傳遞 - 列表框(ListBox)篇

在WPF中滑鼠事件(Event)傳遞中我們介紹了基本的滑鼠事件傳遞
按鈕篇則是在有按鈕的視窗中事件是如何傳遞
這邊我們再舉一個例子,列表框(ListBox),例如

<Window ... Name="Win">
<Grid Name="Grd">
<ListBox Name="Lsb">
<ListBoxItem>
<Rectangle Name="Rec" />
</ListBoxItem>
</ListBox>
</Grid>
</Window>

這邊為了簡化,所以列表框只有一個物件Rec
我們一樣將所有的物件的滑鼠事件都套用相同的處理函式
依照在WPF中滑鼠事件(Event)傳遞所作的設定
出來的結果是

Win : PreviewMouseLeftButtonDown
Win : PreviewMouseDown
Grd : PreviewMouseLeftButtonDown
Grd : PreviewMouseDown
Lsb : PreviewMouseLeftButtonDown
Lsb : PreviewMouseDown
Rec : PreviewMouseLeftButtonDown
Rec : PreviewMouseDown
Rec : MouseLeftButtonDown
Rec : MouseDown
Win : PreviewMouseLeftButtonUp
Win : PreviewMouseUp
Grd : PreviewMouseLeftButtonUp
Grd : PreviewMouseUp
Lsb : PreviewMouseLeftButtonUp
Lsb : PreviewMouseUp
Rec : PreviewMouseLeftButtonUp
Rec : PreviewMouseUp
Rec : MouseLeftButtonUp
Rec : MouseUp
Lsb : MouseLeftButtonUp
Lsb : MouseUp
Grd : MouseLeftButtonUp
Grd : MouseUp
Win : MouseLeftButtonUp
Win : MouseUp

比較在按鈕篇的事件傳遞,我們可以發現,在Down的流程是一模一樣的
可是Up卻全部都回傳了(包括preview和真實的事件)

這邊可以這樣解釋,由於滑鼠按下的時候,列表框處理了按下的動作
選取了某個物件,並將該事件標示成已處理
而在滑鼠起來的時候,則因為選取物件的動作已經處理完成
所以就不再作處理,而直接回傳,所以上層物件都會收到Up的事件

同樣的,我們也可以依照按鈕篇將事件強制處理,在這邊就不贅述了

沒有留言:

張貼留言