UWP ListView Drop получить индекс - PullRequest
0 голосов
/ 07 ноября 2018

У меня есть 2 ListViews, я могу перетащить элемент из ListView1 и перетащить его в ListView2. Если я помещаю элемент между другими элементами, я хочу, чтобы элемент был добавлен в это же место.

Итак, вопрос такой: Как мне получить позицию / индекс, где я уронил свой предмет?

Я ожидал бы найти индекс где-нибудь в DragEventArgs события Drop, но я нигде не могу его найти:

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

}

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018

В любом случае: я возился с этим кодом и, наконец, заставил его работать в соответствии с моими потребностями:

    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;
    }

Спасибо, что указали мне в правильном направлении!

0 голосов
/ 08 ноября 2018

Как мне получить позицию / индекс, где я уронил свой предмет?

В настоящее время событие Drop не предоставляет индекс выпавшего предмета. Но вы можете получить позицию сброса с помощью метода GetPosition и рассчитать индекс вашего текущего предмета. Я реализовал это на основе официального drag & drop образца кода. И вы можете использовать следующий код напрямую.

private double rowHeight;
private async void TargetListView_Drop(object sender, DragEventArgs e)
{
    // This test is in theory not needed as we returned DataPackageOperation.None if
    // the DataPackage did not contained text. However, it is always better if each
    // method is robust by itself
    if (e.DataView.Contains(StandardDataFormats.Text))
    {
        var position = e.GetPosition((UIElement)sender);

        var targetListView = sender as ListView;
        if (targetListView.Items.Count != 0)
        {
            var listItem = targetListView.Items[0];
            var listItemContainer = targetListView.ContainerFromItem(listItem) as ListViewItem;
            var height = listItemContainer.ActualHeight;
            var marginTop = listItemContainer.Margin.Top;
            rowHeight = marginTop + height;
        }

        if (position.Y > rowHeight * targetListView.Items.Count)
        {
            var def = e.GetDeferral();
            var s = await e.DataView.GetTextAsync();
            var items = s.Split('\n');
            foreach (var item in items)
            {
                _selection.Add(item);
            }
            e.AcceptedOperation = DataPackageOperation.Copy;
            def.Complete();

        }
        else
        {
            double index = position.Y / rowHeight;
            var mathIndex = Math.Round(index, MidpointRounding.AwayFromZero);
            var def = e.GetDeferral();
            var s = await e.DataView.GetTextAsync();
            var items = s.Split('\n');
            foreach (var item in items)
            {
                _selection.Insert(Convert.ToInt32(mathIndex), item);
            }
            e.AcceptedOperation = DataPackageOperation.Copy;
            def.Complete();
        }

    }
}
...