UWP TreeView загрузка листьев элемента на treeView_Expanding блокирует дерево - PullRequest
0 голосов
/ 16 апреля 2020

Команда, у меня немного сложная структура данных, здесь более подробное описание . Когда я нажимаю, чтобы развернуть элементы, даже если я использовал await / asyn c, пользовательский интерфейс не показывает мне расширяющиеся элементы, но остается в режиме ожидания, пока не будут созданы все листья. На очень больших подструктурах я ожидал бы, что он откроется и увидит элементы, которые будут добавлены постепенно.

Я сомневаюсь, какое поведение более подходящее: 1) отображение листов при показе здания открывает к проблемам, если использует щелчки вокруг, пока дерево все еще строится. Так что я не уверен, что мне это нравится. 2) поскольку процесс может занять некоторое время, я хотел бы показать что-то вроде «загрузки» или соответствующую визуальную обратную связь для происходящего. Но не знаю, как это сделать.

Что бы вы порекомендовали?

Дополнительная информация: В проекте есть пациенты и посещения под каждого пациента. Структура полностью динамична c, поэтому количество уровней под пациентом не может быть известно заранее, так как каждое посещение может иметь дополнительные посещения и документы, связанные с посещением.

Количество пациентов может быть чрезвычайно большим ( 10K +). Первая проблема с производительностью, с которой я столкнулся, заключалась в том, что загрузка всех пациентов и всех посещений за один прием потребует слишком много времени (> 1 минуты!), Поэтому после нескольких указаний я принял подход, при котором загружаются только пациенты, а пустой лист создается, если пациент посещает. Когда пациент расширяется, все листья для пациента загружаются. Глубина и структура полностью меняется от пациента к пациенту. Таким образом, есть некоторые, которые очень быстро загружаются (1 уровень или всего несколько посещений), а некоторые требуют до 1 или более секунд, поскольку они могут иметь более 50 посещений на 5 или более уровнях.

Как я m с использованием SQLServer Express Я проверил, и нет НИКАКОГО значимого влияния запросов на извлечение данных из БД, поскольку они составляют около миллисекунд.

Соединение с БД осуществляется через EFCore, а конечные элементы загружается через LINQ с ожидаемым ToListAsyn c в рекурсивном режиме: пациент загружает связанные с ним листья. Когда лист загружается, он будет смотреть и загружать вложенные листья ... подчиненные листья будут вести себя одинаково.

Так что я бы НЕ ожидал каких-либо задержек в пользовательском интерфейсе.

Здесь код загрузить листы на пациентов, которые уже посещены и НЕ загружены

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

В листах применяется точно такой же лог c:

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

1 Ответ

0 голосов
/ 18 апреля 2020

Я нашел это:

    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());

, который разблокирует пользовательский интерфейс и позволяет отображать листья при создании. Но хорошо ли это?

...