UWP ListView下拉获取索引
我有两个ListView,我可以从ListView1拖动一个项目并将其放到ListView2上。如果我将项目放在其他项目之间,我希望将项目添加到同一位置 因此,问题是:如何获得我丢弃物品的位置/索引? 我希望在Drop事件的DragEventArgs中找到索引,但我在任何地方都找不到: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未提供您已删
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计算项目的总行高。理论与上述答案相同。