C # WPF Как проверить, находится ли мышь над DataGridComboBoxColumn - PullRequest
0 голосов
/ 27 июня 2018

Я пытаюсь сделать функцию перетаскивания для строк сетки данных, и я использовал обработчик событий MouseMove для столбцов сетки данных. Но теперь я больше не могу нажимать на поле со списком. Я думал о выполнении проверки, чтобы увидеть, находится ли мышь над столбцом поля со списком и выйти из функции, если это так. Но я не знаю, как это сделать. Отправитель только типа DataGrid, и я не могу его использовать. Любая помощь будет высоко ценится.

1 Ответ

0 голосов
/ 28 июня 2018

Вы можете определить базовый тип столбца с помощью событий 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;

Это один из многих подходов для получения элемента родитель / предок из визуального дерева, я все время использую его для таких задач, как та, с которой вы сталкиваетесь.

Вы обнаружите, что метод InputHitTest и указанное выше расширение являются бесценными активами в ваших процедурах перетаскивания.

...