Member 12694392 Ответов: 2

Индикатор выполнения в WPF usercontrol


всем привет,
я новичок в wpf, в настоящее время мне нужен индикатор выполнения, который будет активен при нажатии кнопки.
в текущем сценарии есть некоторый код, написанный на событии нажатия кнопки, которое требует времени для выполнения. я думаю показать индикатор выполнения за время, затраченное на выполнение.
как я могу это сделать???

Что я уже пробовал:

case1:- я пытался увеличить значение индикатора выполнения после определенных строк кода, но значение индикатора выполнения меняется после полного выполнения кода при нажатии кнопки, до тех пор его пусто, даже если код написан. в качестве последней строки нажатия кнопки указывается значение как
ProgressBar1.value=100;
он прямо показывает 100.


вариант 2:-
Application.Current.Dispatcher.Invoke(DispatcherPriority.Background, new Action(delegate { }));

я даже попробовал выше строки кода, динт мне поможет

edmundv

Обычно я подхожу к этим проблемам так: помещаю длительную задачу в отдельный поток и обновляю пользовательский интерфейс значением прогресса. Обычно я использую асинхронный метод с обработчиком прогресса, чтобы сообщить о прогрессе обратно в пользовательский интерфейс/etc.

2 Ответов

Рейтинг:
2

rafaelhoracio

это решение не работает для меня, у меня есть правильные значения, присвоенные значению свойств и максимуму progressBar, но все еще не работает.


CHill60

Плакат решения вряд ли случайно вернется к посту 3-летней давности и увидит ваше "решение". Если вы хотите прокомментировать сообщение, то используйте кнопку "есть вопрос или комментарий?" ссылка рядом с ним. Не публикуйте комментарии в качестве решений - я советую вам удалить это, прежде чем оно будет опущено в небытие

Рейтинг:
0

Angelo L

Вы можете сделать это несколькими способами, диспетчер, задача, Backgroundworker, но следуя больше тому, что вы делали, напишите это таким образом:

ProgressBar1.Dispatcher.Invoke(
    new Action(()=>ProgressBar1.Value=newvalue), 
    DispatcherPriority.Background);

Объявите делегат действия отдельно, если хотите, но это в основном то, что вам нужно сделать. Важно то, что обновление пользовательского интерфейса должно быть сделано из потока, отдельного от остальной части вашего кода. Видеть DispatcherPriority[^]. Исходя из приоритета, рендеринг происходит после выполнения кода. Поэтому, если вы выполняете циклический просмотр некоторого кода и обновляете панель прогресса в том же потоке, то панель прогресса должна дождаться завершения циклического кода, прежде чем она сможет использовать поток для визуализации обновления. По тем же причинам любая тяжелая работа также должна быть отделена от основного потока пользовательского интерфейса, иначе вы блокируете входной уровень, и окно приложения перестает отвечать на запросы до тех пор, пока работа не будет выполнена.

Кроме того, приоритет-это также причина, по которой Вы будете использовать фон для большинства обновлений пользовательского интерфейса. Следующий приоритет-ввод данных. Любое взаимодействие пользователя с пользовательским интерфейсом или перемещение окна, например, будет вводиться. Выше это загружается, и если вы использовали это для обновления элемента управления, то у вас есть такая же проблема, как и раньше, когда на этот раз ваш элемент управления будет обновляться и рендериться, как и должно быть, но вы будете заблокированы от взаимодействия с пользовательским интерфейсом до тех пор, пока он не будет завершен, потому что уровень ввода вынужден ждать.