gpt4 book ai didi

listview - Windows Store 应用程序在 ListView 之间拖放

转载 作者:行者123 更新时间:2023-12-04 16:37:39 24 4
gpt4 key购买 nike

我正在构建一个针对 Windows 8.1 和 Windows 10 的 Windows 应用商店应用程序/通用应用程序,我希望能够在 ListView 之间拖放项目并将项目放置在 ListView 中的特定位置。我遇到的主要问题是我找不到确定项目放置位置的列表索引的好方法。

我找到了一个示例 ( XAML ListView reorder ),但一个重要的区别是我列表中的项目具有可变高度,因此该示例项目用于推断索引的简单计算对我不起作用。

我能够获取 ListView 中项目被放置位置的 x,y 位置,但我无法使用该位置来计算索引。我发现有人提到使用 ListView.GetItemAt(x, y) 或 ListView.HitTest(x, y) 但正如其他人所发现的那样,Windows 通用应用程序中似乎不存在这些方法。我也尝试过使用 VisualTreeHelper.FindElementsInHostCoordinates(),但我要么没有正确使用它,要么我不理解它的用途,因为我无法让它返回结果。

这是我试过的一些示例代码:

private void ListView_OnDrop(object sender, DragEventArgs e)
{
var targetListView = (ListView)sender;

var positionRelativeToTarget = e.GetPosition(targetListView);

var rect = new Rect(positionRelativeToTarget, new Size(10, 15));
var elements = VisualTreeHelper.FindElementsInHostCoordinates(rect, targetListView);

// Trying to get the index in the list where the item was dropped
// 'elements' is always empty
}

作为引用,我使用的是 C#、XAML 和 Visual Studio 2013。

谢谢!

最佳答案

我找到了一个解决方案。我开发了一个信息类来恢复我放置新项目的位置的索引。

public  class Info
{
public int index { get; set; }
public string color { get; set; }
}

然后我定义了我的可观察对象:

ObservableCollection<Info> c = new ObservableCollection<Info>();
c.Add(new Info { color = "#d9202b", index = 0 }); c.Add(new Info { color = "#ffffff", index = 1 });
c.Add(new Info { color = "#15c23c", index = 2 }); c.Add(new Info { color = "#c29b8f", index = 3 });
c.Add(new Info { color = "#0000ff", index = 4 }); c.Add(new Info { color = "#deba83", index = 5 });

我还以同样的方式定义了另一个集合(c2)。对于这个 senario,我将从第二个集合 (c2) 中拖出一个项目并将其放入第一个集合 (c) 因此对于 dragstarted 我使用了这个:

private void x2_DragItemsStarting(object sender, DragItemsStartingEventArgs e)
{
strin = e.Items.FirstOrDefault() as Info;

e.Data.Properties.Add("item", strin);
e.Data.Properties.Add("gridSource", sender);
}

为了恢复关于我放下元素的地方的信息,它应该被放在第一个列表中的一个项目上,所以我使用了这个:

private void x_Drop(object sender, DragEventArgs e)
{
object gridSource;
e.Data.Properties.TryGetValue("gridSource", out gridSource);
if (gridSource == sender)
return;
object sourceItem;
e.Data.Properties.TryGetValue("item", out sourceItem);
//recuperate Info about place of dropped item
Info p = ((FrameworkElement)e.OriginalSource).DataContext as Info;

if(p==null)
{
//its not dropped over an item, lets add it in the end of the collection
c2.Remove(sourceItem as Info);
c.Add(sourceItem as Info);
}
else
{
//here we have information that we need
c2.Remove(sourceItem as Info);
c.Insert(p.index, sourceItem as Info);
//c.Add(strin);
}
Reorder();
}

然后我们应该在 Reorder 方法中为新项目设置索引:

private void Reorder()
{
for (int i = 0; i < c.Count; i++)
c[i].index = i;
for (int i = 0; i < c2.Count; i++)
c2[i].index = i;
}

关于listview - Windows Store 应用程序在 ListView 之间拖放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29422158/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com