1

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

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

4

1 回答 1

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
}

至于你的第二个问题,我认为你写得对。

于 2013-08-17T11:12:18.303 回答