【问题标题】:Left click is returning different originSource than right click左键单击返回与右键单击不同的 originSource
【发布时间】:2014-07-05 14:52:43
【问题描述】:

我有一个这样的 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.Button:编辑”, 右键单击“System.Windows.Controls.TextBlock”。

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

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

【问题讨论】:

    标签: c# wpf xaml


    【解决方案1】:

    首先让我澄清几件事,然后再谈你正在经历的实际行为。

    MouseDown 和 MouseUp 是耦合事件,即它们协同工作。 第一个 mouseDown 按钮被触发,然后 MouseUp 事件被触发。


    此外,PreviewMouseUp 和 MouseUp 之间也有区别。 PreviewMouseUp 是隧道事件,它从根传播到事件的发起者,而 MouseUp 是冒泡事件,它从它的发起者到根目录。


    您遇到的行为是正确的。让我们在点击dataGridColumnHeader时逐步了解示例:

    1. 在 OriginalSource 设置为 TextBlock 的情况下引发 PreviewMouseDown 事件,该事件从窗口传播到 TextBlock。

    2. 然后引发 MouseDown 事件,该事件将从 TextBlock 传播到 Window,除非它由 之间的某些 UIElement 处理(即通过将 e.Handled 设置为 true)DataGridColumnHeader 确实会处理对列进行排序的事件。因此,它不会到达窗口。

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

    您会看到,右键单击时 OriginalSource 为 TextBlock,因为 DataGridColumnHeader 未处理右键单击以对列进行排序。因此,它也可以完美地从根窗口到创建者 TextBlock。

    同样适用于在 Click 事件中处理鼠标左键事件的 Button。


    因此,如果您使用 PreviewMouseRightButtonDown 和 PreviewMouseLeftButtonDown 而不是使用 PreviewMouseRightButtonUp 和 PreviewMouseLeftButtonUp,那么您将看到两种情况下的原始源将是相同的,这将是 TextBlock,因为 MouseDown事件被处理,而不是 PreviewMouseDown。

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

    我建议您阅读有关这些事件的更多信息here

    【讨论】:

      猜你喜欢
      • 2019-04-12
      • 2015-03-03
      • 2019-05-03
      • 2015-10-11
      • 1970-01-01
      • 2022-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多