Первое, что нужно понять, это выполнить операции New/Edit/Delete фоновый поток, чтобы ваш пользовательский интерфейс реагировал и для ProgressBar
мог обновляться в течение времени, необходимого для завершения этих операций.
Предпочтительный и простой способ отключить некоторую работу в фоновом потоке - использовать параллельную библиотеку задач (TPL) и запустить новую задачу. Имейте в виду, что элементы управления WPF имеют сходство потоков, поэтому вы можете обращаться к ним только в потоке, из которого они были созданы, и это поток диспетчера.
Таким образом, вы могли бы осуществить это, установив Visibility
свойства объекта ProgressBar
в Visible
, запустить задачу, которая выполняет фактическую Новый/Редактировать/Удалить операцию, а затем установить Visibility
свойства обратно Collapsed
снова, как только задача закончена:
C#:
pb.Visibility = Visibility.Visible;
Task.Run(()=>
{
//perform your long-running operation here...make sure that you don't access any UI elements
Save();
})
.ContinueWith(task =>
{
//this delegate will be executed back on the UI thread once the task has finished because of the scheduler returned from the TaskScheduler.FromCurrentSynchronizationContext() method...
pb.Visibility = Visibility.Collapsed;
}, System.Threading.CancellationToken.None, TaskContinuationOptions.None, TaskScheduler.FromCurrentSynchronizationContext());
XAML:
<ProgressBar x:Name="pb" IsIndeterminate="True" Visibility="Collapsed" />
Возможно, C#, который вы указали выше, находится в файле xaml.cs? У меня есть функция New/Edit/Delete в моей модели ViewModel, и она «доступна» через «Команды». Я очень новичок в WPF и MVVM, и я просто пытаюсь найти лучшие практики, но я не очень компетентен сам по себе. Кроме того, с удалением, например, я удаляю элемент из списка (очевидно, элемент пользовательского интерфейса), а также из проводника решений (я занят расширением VS), и этот последний занимает пару секунд. Поэтому я не уверен, как мне не нужно обращаться к элементу пользовательского интерфейса, как вы заявили? – Igavshne
Функцию New/Edit/Delete следует реализовать в модели представления. Вместо того, чтобы напрямую установить свойство Visibility для ProgressBar, вы устанавливаете значение свойства source, которое вы привязываете к ProgressBar. Я полагаю, что ваши операции фактически выполняют некоторую работу, которая может занять некоторое время, например, для связи с базой данных или уровнем обслуживания. Если вы просто хотите удалить элемент из списка ListBox или, скорее, ObservableCollection, связанного с ListBox, вам вообще не понадобится ProgressBar. – mm8
Ах да, конечно, я могу установить значение свойства source, связанного с ProgressBar. Да, у меня есть связь с БД. Спасибо, я попробую ответить, а потом вернусь. – Igavshne