В Avalonia использование VirtualizingStackPanel ListBox приводит к медленной загрузке страницы.C#

Место общения программистов C#
Ответить
Anonymous
 В Avalonia использование VirtualizingStackPanel ListBox приводит к медленной загрузке страницы.

Сообщение Anonymous »

В моем приложении я использую переменную viewmodel в сочетании с viewlocator для переключения между страницами в окне. Когда я впервые переключаюсь на страницу с виртуальным списком, происходит небольшая задержка, продолжающаяся около 1 секунды.
Виртуальный список выглядит следующим образом: Во второй и третий раз задержки не было.
Я пробовал тестировать скорость инициализации виртуальной машины и просмотра, и они оба были очень медленными.
Этот список содержит всего 30 записей.
После удаления TextBlock из элементов виртуального списка задержка значительно уменьшилась, но некоторая задержка все равно оставалась.
/>Мне хотелось бы знать, как решить эту проблему, чтобы виртуальный список плавно загружался при первой загрузке.

Ниже приведен дополнительный код.
Изображение

Это моя страница: Это моя модель представления:

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

public class QueuePageViewModel : ViewModelBase
{
private readonly IPlayerService _playerService;

private readonly ObservableAsPropertyHelper _audioFiles;
public ObservableCollection AudioFiles =>  _audioFiles.Value;

public QueuePageViewModel(IPlayerService playerService)
{
_playerService = playerService;
_playerService.GetAllAudioFiles()
.Select(list => new ObservableCollection(list))
.ToProperty(this, x => x.AudioFiles, out _audioFiles);
}
}
Это мой PlayerService:

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

public class PlayerService : IPlayerService, IDisposable
{
// ...
private readonly AudioQueue _audioQueue;
public AudioFile? GetCurrentAudioFile()
{
return _audioQueue.CurrentAudioFile;
}
Это моя AudioQueue:

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

public class AudioQueue
{
public AudioQueue()
{
CurrentIndex = 0;
_audioFiles = new SourceList();
_audioFiles.AddRange([
new AudioFile(
@"some path to mp3"), // just for test
// ...
]);
}

public SourceList _audioFiles;

public IObservable AudioFilesObservable =>
_audioFiles.Connect().ToCollection();

public IReadOnlyList AudioFiles => _audioFiles.Items.ToList();
Виртуальная машина и служба внедряются в контейнер во время инициализации приложения.

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

public override void OnFrameworkInitializationCompleted()
{
var services = new ServiceCollection();

// ...
services.AddTransient();
// ...
services.AddSingleton();

Services = services.BuildServiceProvider();

// ...
base.OnFrameworkInitializationCompleted();
}
Следовательно, этот список является переменной внутри глобального синглтона PlayerService, существующего с момента создания приложения. Создание этой страницы определяется ViewLocator на основе переменной vm внутри MainWindow, что приводит к созданию новой виртуальной машины каждый раз.


Подробнее здесь: https://stackoverflow.com/questions/798 ... ge-loading
Ответить

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

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

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

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

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