我正在我的应用程序中实现简单的拖放功能,我想知道用户是否已将项目放在列表中的第一项(在标题行中)之上,因此我可以将其插入作为第一项。
我正在使用VisualTreeHelper.HitTest
来获取放置位置的项目,但这仅在实际存在项目时有效。
HitTestResult hitTestResults = VisualTreeHelper.HitTest(myListView, location);
当鼠标在标题上时,我会在hitTestResults.VisualHit
中获得多个项目之一。在一些测试中,我得到ListBoxChrome
,TextBlock
和Border
我怎么知道这些是否是标题行的一部分?我不能只是专门测试它们,因为可能会返回其他UI元素。
我可以获取listview标题行的坐标,看看我的观点是否在其中?或者有一种方法可以让我知道我的Point是否在标题行内?
答案 0 :(得分:3)
我不知道您当前的实现情况如何,但您可以走向Visual Tree,直到找到ListViewItem
或GridViewColumnHeader
。如果您找到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;
}