我有点困惑为什么在scrollviewer上设置focusable = false让scrollviewer接收mousedown事件。有人可以解释焦点如何影响鼠标事件吗?
此外,鼠标事件提升的过程究竟是什么?我假设,命中测试是在主窗口上完成的,然后它通过可视化树进行,找到具有最高zindex的元素,并以元素作为目标引发previewmousedown事件。然后,previewmousedown事件隧道到目标,目标处理它并触发一个mousedown事件,该事件向上冒泡,直到它到达可视树的根。
答案 0 :(得分:1)
焦点有两种类型:键盘焦点和逻辑焦点。引自MSDN:
键盘焦点是指接收键盘输入的元素,而逻辑焦点是指具有焦点的焦点范围中的元素。 Keyboard类主要关注键盘焦点,FocusManager主要关注逻辑焦点,但这不是绝对的区别。具有键盘焦点的元素也将具有逻辑焦点,但具有逻辑焦点的元素不一定具有键盘焦点。当您使用Keyboard类设置具有键盘焦点的元素时,这一点很明显,因为它还会在元素上设置逻辑焦点。
在这种情况下,ScrollViewer
可以接受或拒绝逻辑焦点,它与键盘焦点相关联。默认控件通常为Focusable="True"
,同样适用于ScrollViewer
。
也就是说,当Focusable="True"
时,ScrollViewer
有一个虚线框(具有逻辑焦点):
当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
}
关于你的第二个问题,我认为你写得正确。