Как я могу узнать, находится ли мышь над строкой заголовка в WPF ListView? - PullRequest
1 голос
/ 05 февраля 2011

Я реализую простую функцию перетаскивания в моем приложении, и я хотел бы знать, если пользователь сбросил элемент над первым элементом в списке (в строке заголовка), чтобы я мог просто вставить его как первый пункт.

Я использую VisualTreeHelper.HitTest, чтобы получить предмет в позиции выпадения, но это работает, только если там действительно есть предмет.

HitTestResult hitTestResults = VisualTreeHelper.HitTest(myListView, location);

Когда мышь находится в заголовках, я получаю один из множества пунктов в hitTestResults.VisualHit. Всего за несколько тестов я получил ListBoxChrome, TextBlock и Border Как я могу узнать, является ли какой-либо из них частью строки заголовка? Я не могу просто проверить их специально, поскольку могут быть возвращены другие элементы пользовательского интерфейса.

Могу ли я получить координаты строки заголовка списка, чтобы увидеть, находится ли моя точка внутри него? Или есть способ узнать, находится ли моя точка внутри строки заголовка?

1 Ответ

3 голосов
/ 05 февраля 2011

Я не знаю, как выглядит ваша текущая реализация, но вы можете пройтись по дереву визуалов, пока не найдете ListViewItem или GridViewColumnHeader. Если вы нашли GridViewColumnHeader, вы знаете, что предмет был уронен в этот конкретный заголовок.

Здесь выложен небольшой пример проекта, демонстрирующий эффект с MessageBox on drop: http://www.mediafire.com/?v3l8nl4rnewhz5s

Это будет выглядеть примерно так

private void ListView_Drop(object sender, DragEventArgs e)
{
    ListView parent = sender as ListView;
    YourDataClass data = e.Data.GetData(typeof(YourDataClass)) as YourDataClass;
    if (data != null)
    {
        HitTestResult hitTestResult = VisualTreeHelper.HitTest(parent, e.GetPosition(parent));
        ListViewItem hitItem = VisualTreeHelpers.GetVisualParent<ListViewItem>(hitTestResult.VisualHit);
        GridViewColumnHeader columnHeader = VisualTreeHelpers.GetVisualParent<GridViewColumnHeader>(hitTestResult.VisualHit);
        if (hitItem != null) // ListViewItem Drop
        {
            //..
        }
        else if (columnHeader != null) // Header Drop
        {
            //..
        }
    }
}

public static T GetVisualParent<T>(object childObject) where T : Visual
{
    DependencyObject child = childObject as DependencyObject;
    while ((child != null) && !(child is T))
    {
        child = VisualTreeHelper.GetParent(child);
    }
    return child as T;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...