UWP ListView下拉获取索引

UWP ListView下拉获取索引,uwp,drag-and-drop,Uwp,Drag And Drop,我有两个ListView,我可以从ListView1拖动一个项目并将其放到ListView2上。如果我将项目放在其他项目之间,我希望将项目添加到同一位置 因此,问题是:如何获得我丢弃物品的位置/索引? 我希望在Drop事件的DragEventArgs中找到索引,但我在任何地方都找不到: private async void ListView2_Drop(object sender, DragEventArgs e) { } 如何获取我丢弃物品的位置/索引 当前,Dropevent未提供您已删

我有两个ListView,我可以从ListView1拖动一个项目并将其放到ListView2上。如果我将项目放在其他项目之间,我希望将项目添加到同一位置

因此,问题是:如何获得我丢弃物品的位置/索引?

我希望在Drop事件的DragEventArgs中找到索引,但我在任何地方都找不到:

private async void ListView2_Drop(object sender, DragEventArgs e)
{

}
如何获取我丢弃物品的位置/索引

当前,
Drop
event未提供您已删除项目的索引。但是,您可以使用该方法获得放置位置,并计算当前放置项目的索引。我已经根据官方代码示例实现了它。您可以直接使用下面的代码

private双排高;
私有异步void TargetListView_Drop(对象发送方,DragEventArgs e)
{
//理论上不需要此测试,因为我们返回了DataPackageOperation。如果
//数据包不包含文本。但是,如果每个
//该方法本身具有鲁棒性
if(例如DataView.Contains(StandardDataFormats.Text))
{
var position=e.GetPosition((UIElement)发送方);
var targetListView=发送方作为ListView;
如果(targetListView.Items.Count!=0)
{
var listItem=targetListView.Items[0];
var listItemContainer=targetListView.ContainerFromItem(listItem)作为ListViewItem;
var height=listItemContainer.ActualHeight;
var marginTop=listItemContainer.Margin.Top;
行高=边距+高度;
}
if(position.Y>rowHeight*targetListView.Items.Count)
{
var def=e.getDeleral();
var s=await e.DataView.GetTextAsync();
var items=s.Split('\n');
foreach(项目中的var项目)
{
_选择。添加(项目);
}
e、 AcceptedOperation=DataPackageOperation.Copy;
def.Complete();
}
其他的
{
双索引=位置Y/行高;
var mathIndex=Math.Round(索引,中点Rounding.AwayFromZero);
var def=e.getDeleral();
var s=await e.DataView.GetTextAsync();
var items=s.Split('\n');
foreach(项目中的var项目)
{
_选择.插入(转换为32(mathIndex),项);
}
e、 AcceptedOperation=DataPackageOperation.Copy;
def.Complete();
}
}
}

无论如何:我已经修改了这段代码,终于让它满足了我的需要:

    private async void MyListView_Drop(object sender, DragEventArgs e)
    {
        var scrollViewer = VisualTreeHelper.GetChild(VisualTreeHelper.GetChild(MyListView, 0), 0) as ScrollViewer;
        var position = e.GetPosition((ListView)sender);
        var positionY = scrollViewer.VerticalOffset + position.Y;
        var index = GetItemIndex(positionY, MyListView);

        // do something useful with the index... 
    }

    int GetItemIndex(double positionY, ListView targetListView)
    {
        var index = 0;
        double height = 0;

        foreach (var item in targetListView.Items)
        {
            height += GetRowHeight(item, targetListView);
            if (height > positionY) return index;
            index++;
        }

        return index;
    }

    double GetRowHeight(object listItem, ListView targetListView)
    { 
        var listItemContainer = targetListView.ContainerFromItem(listItem) as ListViewItem;
        var height = listItemContainer.ActualHeight;
        var marginTop = listItemContainer.Margin.Top;
        return marginTop + height;
    }

谢谢你给我指明了正确的方向

嗯,看起来这段代码实际上不起作用:e.GetPosition给了我ListView上方的相对位置,所以如果我有一个长列表,向下滚动列表,并在视图中的第二项和第三项之间悬停,这段代码会给我一个索引2,但上面有很多项是看不见的。其次,此代码假设所有行的高度都相同,而我的应用程序中并非如此。当我将鼠标悬停在项目上时,这些项目会在listview中移开。发生这种情况时是否会触发事件?当然,上面的答案只适用于相同的行高。对于不同的行高,可以使用foreach计算项目的总行高。理论与上述答案相同。