左键返回的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"。

这怎么可能?两次点击应该返回相同的内容。

我没有使用任何自定义代码来处理类似的鼠标

左键返回的originSource与右键返回的不同

在进入你正在经历的实际行为之前,让我先澄清一些事情。

MouseDown和MouseUp是耦合事件,即它们一起工作。首先触发mouseDown按钮,然后触发MouseUp事件


同样,PreviewMouseUp和MouseUp也有区别。PreviewMouseUp是隧道事件,它从根传递到事件的发起者,而MouseUp是冒泡事件从发起者传递到根。


你正在经历的行为是正确的。让我们一步一步地了解示例,当您单击dataGridColumnHeader:

  1. PreviewMouseDown事件被引发,OriginalSource设置为TextBlock,从窗口移动到TextBlock。

  2. 然后引发MouseDown事件,该事件将从TextBlock传递到Window,除非它被之间的一些元素处理(即:通过将e.Handled设置为true)。和DataGridColumnHeader处理事件排序列。因此,它不会向上移动到窗口

  3. 现在,相应的PreviewMouseUp事件将被引发,其原始源将被设置为处理MouseDown事件的控件,在您的情况下是DataGridColumnHeader。因此,您可以在控制台中看到DataGridColumnHeader。

你看,OriginalSource作为TextBlock右击,因为右击不是由DataGridColumnHeader处理排序列。因此,它完美地从根窗口来回移动到发起者TextBlock。

在Click事件中处理鼠标左键事件的按钮也是如此。


所以,如果不是使用PreviewMouseRightButtonUp和PreviewMouseLeftButtonUp,你使用PreviewMouseRightButtonDown和PreviewMouseLeftButtonDown,你会看到在这两种情况下原始源将是相同的这将是TextBlock因为MouseDown事件被处理而不是PreviewMouseDown

<DataGrid
PreviewMouseRightButtonDown="BookGrid_PreviewMouseRightButtonUp"             
PreviewMouseLeftButtonDown="BookGrid_PreviewMouseRightButtonUp">....</DataGrid>

我建议你在这里阅读更多关于这些事件的信息。