左键返回的originSource与右键返回的不同
本文关键字:返回 右键 originSource | 更新日期: 2023-09-27 18:11:29
我有一个这样的DataGrid:
<DataGrid
PreviewMouseRightButtonUp="BookGrid_PreviewMouseRightButtonUp"
PreviewMouseLeftButtonUp="BookGrid_PreviewMouseRightButtonUp">....</DataGrid>
(数据网格是带有自动生成列的默认数据网格)
背后的代码:
private void BookGrid_PreviewMouseRightButtonUp(object sender, MouseButtonEventArgs e)
{
Debug.WriteLine(e.OriginalSource);
}
例如,当我用鼠标左键单击列的标题时,调试输出如下:
System.Windows.Controls.Primitives。DataGridColumnHeader:类别
但是当我用鼠标右键点击同一位置时:
System.Windows.Controls.TextBlock
同样的事情,当我试图点击一个表单按钮,左键"System.Windows.Controls"。按钮:编辑",右键单击"System.Windows.Controls.TextBlock"。
这怎么可能?两次点击应该返回相同的内容。
我没有使用任何自定义代码来处理类似的鼠标
在进入你正在经历的实际行为之前,让我先澄清一些事情。
MouseDown和MouseUp是耦合事件,即它们一起工作。首先触发mouseDown按钮,然后触发MouseUp事件
同样,PreviewMouseUp和MouseUp也有区别。PreviewMouseUp是隧道事件,它从根传递到事件的发起者,而MouseUp是冒泡事件从发起者传递到根。
你正在经历的行为是正确的。让我们一步一步地了解示例,当您单击dataGridColumnHeader:
时PreviewMouseDown事件被引发,OriginalSource设置为TextBlock,从窗口移动到TextBlock。
然后引发MouseDown事件,该事件将从TextBlock传递到Window,除非它被之间的一些元素处理(即:通过将e.Handled设置为true)。和DataGridColumnHeader处理事件排序列。因此,它不会向上移动到窗口
现在,相应的PreviewMouseUp事件将被引发,其原始源将被设置为处理MouseDown事件的控件,在您的情况下是DataGridColumnHeader。因此,您可以在控制台中看到DataGridColumnHeader。
你看,OriginalSource作为TextBlock右击,因为右击不是由DataGridColumnHeader处理排序列。因此,它完美地从根窗口来回移动到发起者TextBlock。
在Click事件中处理鼠标左键事件的按钮也是如此。
所以,如果不是使用PreviewMouseRightButtonUp和PreviewMouseLeftButtonUp,你使用PreviewMouseRightButtonDown和PreviewMouseLeftButtonDown,你会看到在这两种情况下原始源将是相同的这将是TextBlock因为MouseDown事件被处理而不是PreviewMouseDown
<DataGrid
PreviewMouseRightButtonDown="BookGrid_PreviewMouseRightButtonUp"
PreviewMouseLeftButtonDown="BookGrid_PreviewMouseRightButtonUp">....</DataGrid>
我建议你在这里阅读更多关于这些事件的信息。