C# 聚焦如何影响鼠标事件的引发和处理?
我有点困惑,为什么在scrollviewer上设置focusable=false可以让scrollviewer接收mousedown事件。有人能解释一下焦点是如何影响鼠标事件的吗C# 聚焦如何影响鼠标事件的引发和处理?,c#,wpf,xaml,C#,Wpf,Xaml,我有点困惑,为什么在scrollviewer上设置focusable=false可以让scrollviewer接收mousedown事件。有人能解释一下焦点是如何影响鼠标事件的吗 另外,鼠标事件引发的具体过程是什么?我假设,命中测试是在主窗口上完成的,然后它在可视化树中前进,找到zindex最高的元素,并以该元素为目标引发previewmousedown事件。previewmousedown事件然后通过隧道到达目标,目标处理它并触发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
}
至于你的第二个问题,我认为你写得对