C#WPF如何检查鼠标是否在DataGridComboBoxColumn上

时间:2018-06-27 15:27:49

标签: c# wpf datagrid mousemove

我试图在datagrid行上进行拖放功能,并且在datagrid列上使用了MouseMove事件处理程序。但是现在我不能再单击组合框。我正在考虑执行检查以查看鼠标是否在组合框列上方,如果存在则退出该功能。但是我不知道该怎么做。发件人仅是DataGrid类型,我无法使用它。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

您可以通过TZ=Asia/Istanbul 30 22 * * * MouseMove事件来确定列的基础类型,

PreviewMouseMove

您会注意到我在这里使用了一个有趣的扩展名。这是来源:

private void DataGrid_OnPreviewMouseMove(object sender, MouseEventArgs e)
{
    var dataGrid = (DataGrid)sender;

    var inputElement = dataGrid.InputHitTest(e.GetPosition(dataGrid)); // Get the element under mouse pointer

    var cell = ((Visual)inputElement).GetAncestorOfType<DataGridCell>(); // Get the parent DataGridCell element

    if (cell == null)
        return; // Only interested in cells

    var column = cell.Column; // Simple...

    if (column is DataGridComboBoxColumn comboColumn)
        ; // This is a combo box column
}

这是从视觉树中获取父元素/祖先元素的众多方法之一,我一直在使用它来完成诸如您要面对的任务之类的任务。

在您的拖放例程中,您会发现/// <summary> /// Returns a first ancestor of the provided type. /// </summary> public static Visual GetAncestorOfType(this Visual element, Type type) { if (element == null) return null; if (type == null) throw new ArgumentException(nameof(type)); (element as FrameworkElement)?.ApplyTemplate(); if (!(VisualTreeHelper.GetParent(element) is Visual parent)) return null; return type.IsInstanceOfType(parent) ? parent : GetAncestorOfType(parent, type); } /// <summary> /// Returns a first ancestor of the provided type. /// </summary> public static T GetAncestorOfType<T>(this Visual element) where T : Visual => GetAncestorOfType(element, typeof(T)) as T; 方法和上述扩展名是宝贵的资产。