C# 聚焦如何影响鼠标事件的引发和处理?

C# 聚焦如何影响鼠标事件的引发和处理?,c#,wpf,xaml,C#,Wpf,Xaml,我有点困惑,为什么在scrollviewer上设置focusable=false可以让scrollviewer接收mousedown事件。有人能解释一下焦点是如何影响鼠标事件的吗 另外,鼠标事件引发的具体过程是什么?我假设,命中测试是在主窗口上完成的,然后它在可视化树中前进,找到zindex最高的元素,并以该元素为目标引发previewmousedown事件。previewmousedown事件然后通过隧道到达目标,目标处理它并触发mousedown事件,该事件向上冒泡,直到到达视觉树的根。有两

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


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

有两种焦点类型:键盘焦点和逻辑焦点。引自:

键盘焦点是指接收键盘输入的元素,逻辑焦点是指焦点作用域中具有焦点的元素。键盘类主要关注键盘焦点,而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
}

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

有两种焦点类型:键盘焦点和逻辑焦点。引自:

键盘焦点是指接收键盘输入的元素,逻辑焦点是指焦点作用域中具有焦点的元素。键盘类主要关注键盘焦点,而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
}
至于你的第二个问题,我认为你写得对