2011-02-05 62 views
1

我在我的应用程序中实现了简单的拖放功能,我想知道用户是否已将项目放在列表中的第一个项目上方(在标题行中),以便我可以将其插入为第一项。如何知道鼠标是否位于WPF ListView中的标题行上?

我正在使用​​将物品放置在放置位置,但这仅适用于实际存在物品的情况。

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

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

我可以得到列表视图的标题行的坐标,看看我的观点是否在里面吗?或者有什么方法可以知道我的Point是否在该标题行内?

+0

我不明白为什么`VisualTreeHelper.HitTest`不应该返回Header项目(可能是'Border'中的'TextBlock`)。你可以添加一些示例代码来重现你的问题吗? – 2011-02-05 10:39:03

回答

3

我不知道你目前的实施方式是怎样的,但你可以走上视觉树,直到你找到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; 
} 
相关问题