繁体   English   中英

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

[英]C# WPF How to check if mouse is over DataGridComboBoxColumn

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

您可以通过MouseMovePreviewMouseMove事件确定列的基础类型,如下所示:

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;

这是从视觉树中获取父元素/祖先元素的多种方法之一,我一直将其用于诸如您面临的任务之类的任务。

您将在拖放例程中发现InputHitTest方法和上述扩展是宝贵的资产。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM