UWP / C#:ObservableCollection就地排序(不滚动) - c#

在UWP应用中,我正在尝试对绑定到ObservableCollectionListView进行排序-因此,collection.OrderBy(..)(创建新集合)不是一种选择。

到目前为止,我一直使用此扩展方法:

public static void Sort<TSource, TKey>(this 
ObservableCollection<TSource> source, Func<TSource, TKey> keySelector)
{
    List<TSource> sortedList = source.OrderBy(keySelector).ToList();
    source.Clear();
    foreach (var sortedItem in sortedList)
    {
        source.Add(sortedItem);
    }
}

不幸的是,由于source.Clear(),这种方式会重置当前的“滚动偏移量”,并且相应的ListView会一直滚动回到顶部,这是非常糟糕的用户体验。

有任何想法吗?

参考方案

您可以尝试创建一个临时集合,其中包含原始集合中的所有项目,对其进行排序,然后循环浏览其项目,然后仅对需要更新位置的项目进行重新排序。像这样-

public static void Sort<TSource, TKey>(this ObservableCollection<TSource> source, Func<TSource, TKey> keySelector)
{
    var sortedSource = source.OrderBy(keySelector).ToList();

    for (var i = 0; i < sortedSource.Count; i++)
    {
        var itemToSort = sortedSource[i];

        // If the item is already at the right position, leave it and continue.
        if (source.IndexOf(itemToSort) == i)
        {
            continue;
        }

        source.Remove(itemToSort);
        source.Insert(i, itemToSort);
    }
}

另外,您将希望ListView在制作动画时保持滚动偏移。可以通过设置-

<ItemsPanelTemplate>
    <ItemsStackPanel ItemsUpdatingScrollMode="KeepScrollOffset" />
</ItemsPanelTemplate>

我发现这个与UX相关的问题确实很有趣,甚至为它创建了一个demo project。 :)下面的gif演示了最终结果。对我来说,从视觉上来说,它提供了更好的体验,即排序对哪些项进行了重新定位或不进行了重新排序。

UWP / C#:ObservableCollection就地排序(不滚动) - c#

Tensorflow到ONNX的转换 - python

我目前正在尝试将通过本教程(https://github.com/thtrieu/darkflow)创建的已保存(正在工作)的.pb文件转换为onnx文件。我目前正在使用winML工具,但是转换的结果根本不起作用(输入参数错误+整个体系结构不正确)。我的输入参数(在自述文件的最底部指定):input:0输出节点:输出:0我想在HoloLens上运行的UWP应…

Windows上的Android或UWP建议 - java

我在Play商店中有一个Android应用,我经常在工作中使用它。它基于LDAP。我可以将应用程序移植到Windows Java应用程序,C#Windows Form应用程序或通用应用程序,因为我拥有完整的源代码并具有所有这些方面的经验,但是我宁愿不更改界面(这是将其移植到的最困难的部分)任何东西)。除了界面之外,没有任何真正依赖于Android本身的东西。…

Java中的“ <<”运算符 - java

最喜欢的语句来自Java的Character类:(1 << Character.PARAGRAPH_SEPARATOR)) >> type PARAGRAPH_SEPARATOR是字节,type是整数。这句话中的操作员,他们做什么?如何以及在哪里可以使用这些运算符?这是oracles java.lang.Character文档。该类中…

Win2D获取语义标签值 - c#

我正在使用Win2D.UWP来获取系统字体集。我需要过滤查询的字体并将它们分组为“ Serif”,“ Sans-Serif”,“ Decorative”等类别(例如Adobe应用程序或Corel Font Manager)。据我研究,信息可以通过带有参数Microsoft.Graphics.Canvas.Text.CanvasFontSet.GetPrope…

当我运行python代码时,它说“ <<目前是意外情况” - python

基本上,这是我们合作者的python代码,用于生成网格,该网格是在Linux环境下开发的。我使用Cygwin在Windows上运行此代码。麻烦部分如下。 BiV_temp.geo也是一个python脚本。因此,命令是用预定义的数字和文件名替换脚本BiV_temp.geo中的字符串。os.system('cp BiV_fiber.geo BiV_te…