可聚焦如何影响鼠标事件的提升和处理?

时间:2013-08-16 22:33:50

标签: c# wpf xaml

我有点困惑为什么在scrollviewer上设置focusable = false让scrollviewer接收mousedown事件。有人可以解释焦点如何影响鼠标事件吗?

此外,鼠标事件提升的过程究竟是什么?我假设,命中测试是在主窗口上完成的,然后它通过可视化树进行,找到具有最高zindex的元素,并以元素作为目标引发previewmousedown事件。然后,previewmousedown事件隧道到目标,目标处理它并触发一个mousedown事件,该事件向上冒泡,直到它到达可视树的根。

1 个答案:

答案 0 :(得分: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
}

关于你的第二个问题,我认为你写得正确。