2011-02-05 45 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; 
} 
相關問題