2013-08-16 19 views
1

我有點困惑,爲什麼在scrollviewer上設置focusable = false可以讓scrollviewer接收mousedown事件。有人能解釋焦點如何影響鼠標事件嗎?可聚焦如何影響鼠標事件的提升和處理?

另外,鼠標事件提升的過程究竟是什麼?我假設,命中測試是在主窗口上完成的,然後它在視覺樹中前進,找到zindex最高的元素,並以此元素爲目標引發一個previewmousedown事件。然後,previewmousedown事件將隧道傳送到目標,目標將處理該目標並觸發一個向上冒泡的mousedown事件,直到它到達可視樹的根。

回答

1

有兩種焦點:鍵盤焦點和邏輯焦點。引自MSDN

鍵盤焦點是指接收鍵盤輸入的元素,而邏輯焦點是指焦點範圍內的焦點範圍內的元素。 Keyboard類主要關注鍵盤焦點,FocusManager主要關注邏輯焦點,但這不是絕對的區別。具有鍵盤焦點的元素也將具有邏輯焦點,但具有邏輯焦點的元素不一定具有鍵盤焦點。當您使用Keyboard類設置具有鍵盤焦點的元素時,這是顯而易見的,因爲它還設置了元素的邏輯焦點。

在這種情況下,ScrollViewer可以接受或拒絕邏輯焦點,它與鍵盤焦點相關聯。默認控制通常有Focusable="True",這同樣適用於ScrollViewer

也就是說,當Focusable="True"ScrollViewer有一個虛線框(與邏輯焦點):

enter image description here

Focusable="False"ScrollViewer沒有一個虛線框,因爲現在他不接受邏輯焦點。您還可以在FocusVisualStyle的幫助下自定義焦點的外觀。

正如您所看到的,沒有提及鼠標事件,唯一能夠影響它的事件 - 這是一個鍵盤事件。沒有觸發事件,則需要設置元素IsEnabled="False",或阻止使用e.Handled = true;事件呼叫:

private void ScrollViewer_MouseDown(object sender, MouseButtonEventArgs e) 
{ 
    e.Handled = true; 

    MessageBox.Show("MouseDown!"); // now when you click, it will not be displayed 
} 

關於你的第二個問題,我想你正確地寫道。