如何知道鼠标是否在WPF ListView中的标题行上?

时间:2011-02-05 06:10:51

标签: wpf listview coordinates

我正在我的应用程序中实现简单的拖放功能,我想知道用户是否已将项目放在列表中的第一项(在标题行中)之上,因此我可以将其插入作为第一项。

我正在使用VisualTreeHelper.HitTest来获取放置位置的项目,但这仅在实际存在项目时有效。

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

当鼠标在标题上时,我会在hitTestResults.VisualHit中获得多个项目之一。在一些测试中,我得到ListBoxChromeTextBlockBorder我怎么知道这些是否是标题行的一部分?我不能只是专门测试它们,因为可能会返回其他UI元素。

我可以获取listview标题行的坐标,看看我的观点是否在其中?或者有一种方法可以让我知道我的Point是否在标题行内?

1 个答案:

答案 0 :(得分:3)

我不知道您当前的实现情况如何,但您可以走向Visual Tree,直到找到ListViewItemGridViewColumnHeader。如果您找到GridViewColumnHeader,则表示该项目已在此特定标题中删除。

在此处上传了一个小型示例项目,展示了MessageBox在放置时的效果: 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;
}