Maui Data Load Freezes UIC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Maui Data Load Freezes UI

Сообщение Anonymous »

У нас есть приложение Maui, которое управляет некоторыми задачами на машинах в сети. В основном он имеет две основные страницы, задачи и машины.

Код: Выделить всё

[ObservableProperty]
private ObservableCollection tasks;
[ObservableProperty]
private ObservableCollection subTasks;
< /code>
При нажатии на задачу выполняется следующая команда (для установки выбранной задачи и получения подзадач): < /p>
[RelayCommand]
private async Task Clicked(string taskId)
{
if (isCtrlPressed)
{
// Add to selection without removing existing selections
var taskToSelect = Tasks.FirstOrDefault(t => t.ID == taskId);
if (taskToSelect != null)
{
if (SelectedTaskIds.Contains(taskToSelect.ID))
{
SelectedTaskIds.Remove(taskToSelect.ID);
taskToSelect.IsSelected = false;
}
else
{
SelectedTaskIds.Add(taskToSelect.ID);
taskToSelect.IsSelected = true;
}
}
}
else if (isShiftPressed)
{
// Select range between first selected and current
var firstSelected = Tasks.FirstOrDefault(t => t.IsSelected);
if (firstSelected != null)
{
var startIndex = Tasks.IndexOf(firstSelected);
var endIndex = Tasks.IndexOf(Tasks.First(t => t.ID == taskId));
var start = Math.Min(startIndex, endIndex);
var end = Math.Max(startIndex, endIndex);

for (int i = start; i  t.ID == taskId);
SelectedTaskIds.Add(taskId);
taskToSelect.IsSelected = true;
}

if (SelectedTaskIds.Any())
{
var lastSelectedId = SelectedTaskIds.Last();
SelectedFirstTask = Tasks.FirstOrDefault(t => t.ID == lastSelectedId);
taskDetailvm.SelectedTask = SelectedFirstTask;

await LoadSubTasks(SelectedFirstTask.ID);
}

// Alert selected task IDs
// string selectedIds = string.Join(", ", SelectedTaskIds);
// Application.Current.MainPage.DisplayAlert("Selected Tasks", selectedIds, "OK");
}

[RelayCommand]
private async Task LoadSubTasks(string taskId)
{
if (string.IsNullOrEmpty(taskId))
return;

var task = await CoreTaskRM.LoadFromFile(taskId);
if (task == null)
return;

// Load data in background
var data = await Task.Run(() => task.GetSubTasks().Result);
var newSubTasks = data.Select(item => _mapper.Map(item)).ToList();

// Update UI on main thread without blocking
await MainThread.InvokeOnMainThreadAsync(() =>
{
UpdateSubTasksCollection(SubTasks, newSubTasks);
});
}

private void UpdateSubTasksCollection(ObservableCollection existingTasks, List newTasks)
{
foreach (var newTask in newTasks)
{
var existingTask = existingTasks.FirstOrDefault(t => t.ID == newTask.ID);

if (existingTask != null)
{

if (existingTask.Progress != newTask.Progress || existingTask.PCMachineName != newTask.PCMachineName || existingTask.Status != newTask.Status)
{
existingTask.Progress = newTask.Progress;
existingTask.PCMachineName = newTask.PCMachineName;
existingTask.Status = newTask.Status;
}
}
else
{
existingTasks.Add(newTask);
}
}

for (int i = existingTasks.Count - 1; i >= 0; i--)
{
if (!newTasks.Any(t =>  t.ID == existingTasks[i].ID))
{
existingTasks.RemoveAt(i);
}
}
}
< /code>
Я покажу, какую часть зрения она связана с: < /p>
taskpage: < /p>
using CommunityToolkit.Mvvm.Messaging;
using CoreFinderUI.ViewModel;

namespace CoreFinderUI;

public partial class TaskPage : ContentPage
{

private readonly TaskPageViewModel _taskPageVM;
private readonly TaskDetailSideViewModel _taskDetailSideVM;

public TaskPage(TaskPageViewModel pageViewModel, TaskDetailSideViewModel detailViewModel)
{
InitializeComponent();
_taskPageVM = pageViewModel;
_taskDetailSideVM = detailViewModel;

BindingContext = _taskPageVM;

_taskPageVM.PropertyChanged += (s, e) =>
{
if (e.PropertyName == nameof(_taskPageVM.SelectedFirstTask))
{
_taskDetailSideVM.SelectedTask = _taskPageVM.SelectedFirstTask;
}
};

}

protected override void OnNavigatedTo(NavigatedToEventArgs args)
{
base.OnNavigatedTo(args);
WeakReferenceMessenger.Default.Send(new NavigationMessage());
}
}
< /code>
На этой странице задачи есть задача adetailsideview indested: < /p>
    
< /code>
Внутри этого задачи.                        










И там отображаются подзадачи, которые замораживают пользовательский интерфейс во время загрузки, но после того, как они загружены, все в порядке.>

Подробнее здесь: https://stackoverflow.com/questions/795 ... freezes-ui
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • MySQL: вставьте в Select Freezes вставки в таблицу источников
    Anonymous » » в форуме MySql
    0 Ответы
    3 Просмотры
    Последнее сообщение Anonymous
  • Garuda Linux Dual Boot Freezes в «Конфигурации диспетчера устройств» [закрыто] [закрыто]
    Anonymous » » в форуме Linux
    0 Ответы
    13 Просмотры
    Последнее сообщение Anonymous
  • Garuda Linux Dual Boot Freezes в «Конфигурации диспетчера устройств» [закрыто] [закрыто]
    Anonymous » » в форуме Linux
    0 Ответы
    11 Просмотры
    Последнее сообщение Anonymous
  • Ошибка joblib.load и Pickle.load «Нет атрибута XGBoostLabelEncoder»
    Anonymous » » в форуме Python
    0 Ответы
    59 Просмотры
    Последнее сообщение Anonymous
  • Meta load() Метод загрузки рекламы устарел. Как использовать load(withBidPayload: <#T##String#>)
    Anonymous » » в форуме IOS
    0 Ответы
    56 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C#»