【问题标题】:UWP TreeView loading leafs of element on treeView_Expanding does block the treeUWP TreeView在treeView扩展中加载元素的叶子确实阻塞了树
【发布时间】:2020-07-30 04:44:07
【问题描述】:

团队, 我的数据结构有点复杂,here a more detailed description。当我单击以展开项目时,即使我使用了等待/异步,UI 也不会向我显示展开的元素,而是保持暂停状态,直到创建所有叶子。 在非常大的子结构上,我希望打开它并看到要逐步添加的项目。

我怀疑哪种行为更合适: 1)如果在树仍在构建时点击周围的使用,则在构建时显示叶子会出现问题。所以我不确定我喜欢这个 2) 由于这个过程可能需要一些时间,我想展示一些类似“加载”的内容或对正在发生的事情的适当视觉反馈。但是不知道怎么办。

你会推荐什么?

更多信息: 该项目有一个病人和每个病人下的访问。该结构是完全动态的,因此无法提前知道患者下的级别数,因为每次访问都可以有子访问和与访问相关联的文档。

患者数量可能极高(10K+)。我遇到的第一个性能问题是一次性加载所有患者和所有访问将需要太多时间(> 1 分钟!)所以,遵循几个指导,我采用了一种方法,只有患者被加载并且空如果患者来访,则创建叶子。 当病人展开时,病人的所有叶片都被加载。深度和结构因患者而异。因此,有些加载速度非常快(1 级或总共很少访问),有些则需要长达 1 秒或更长时间,因为它们可以在 5 级或更多级别上进行 50 次以上的访问。

当我使用 SQLServer Express 时,我已经检查过,从数据库中检索数据的查询没有相关影响,因为它们大约是毫秒。

与 DB 的连接是通过 EFCore 完成的,叶子项目通过 LINQ 加载,带有等待 ToListAsync 的递归更多:患者将加载连接到他的叶子。当叶子被加载时,会查找并加载子叶子......子叶子将以相同的方式表现。

所以我没想到 UI 会出现任何延迟。

这里的代码用于在有访问但尚未加载的患者身上加载叶子

private async void treeView_Expanding(WinUI.TreeView sender, WinUI.TreeViewExpandingEventArgs args)
{
    if (args.Item is MTreeViewPaz)
    {
        if ((((MTreeViewPaz)args.Item).VisitsN > 0) && (((MTreeViewPaz)args.Item).Loaded == LoadingStatus.NotStarted))
        {

            await ((MTreeViewPaz)args.Item).LoadDataAsync();
        }
    }
}

在叶子中应用完全相同的逻辑:

public async Task LoadDataAsync()
{
    Loaded = LoadingStatus.Loading;

    var aList = App.gDataContext.Cache.VVisitHierarchy
        .Where(a => a.CodPaz == _PazV.CodPaz && a.Parent == null)
        .OrderBy(b => b.CreationOrd).ThenBy(b => b.Data).ThenBy(b => b.CodPar)
        .ToList();
    foreach (var item in aList)
    {
        if (item.Visits > 0)
        {
            MTreeViewVisit aMVisit = new MTreeViewVisit(item);

            Visits.Add(aMVisit);
            if (item.Visits > 0)
            {
                await aMVisit.LoadDataAsync();
            }
        }
    }
    Visits.RemoveAt(0);
    Loaded = LoadingStatus.Loaded;
}

【问题讨论】:

  • 您好,请详细说明not show me the expanding elements but remains on hold till all the leafs are created. 是什么意思,我检查了您的项目,它会在展开时将项目添加到 TreeView。另外,为了让别人理解你的问题,请添加一些关于你的项目的描述(而不是添加定向链接)
  • 查看此视频:我在 0:05 点击展开...它在 0:06 1drv.ms/v/s!AohVtHaw3aCiwZhrzy_SgQ_4VdKXvQ?e=fTih4J 打开希望这会有所帮助。
  • @Richard:谢谢,我已经更新了场景细节。如果我需要更多详细信息,请告诉我。
  • 您好,很高兴您找到了解决方案。好像打开了一个新任务来加载数据。这可能是您项目的一种方式。可以标记一下,对遇到同样问题的人有帮助

标签: c# xaml uwp treeview uwp-xaml


【解决方案1】:

我发现了这个:

    var aList = await Task.Run(() => App.gDataContext.Cache.VVisitHierarchy
        .Where(a => a.CodPaz == _PazV.CodPaz && a.Parent == null)
        .OrderBy(b => b.CreationOrd).ThenBy(b => b.Data).ThenBy(b => b.CodPar)
        .ToList());

解锁 UI 并允许在创建时显示叶子。 但是这样好吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 2019-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-22
    相关资源
    最近更新 更多