Как показывать и убирать ProgressBar во время клика по CheckBox
Заранее извиняюсь если не совсем корректно сформировал заголовок (не знаю как правильно сформировать мысль в виде короткого вопроса)
У меня есть wpf grid на котором есть ProgressBar (MainProgressBar) и есть CheckBox
Функция Click у чекботса выглядит:
private void CheckBox_Checked(object sender, RoutedEventArgs e)
{
MainProgressBar.Visibility = Visibility.Visible;
// Здесь функции, в которых я изменяю объекты на форме, например, создаю карту на бэкграунде
// Выполнение функций занимает более 1 минуты
MainProgressBar.Visibility = Visibility.Hidden;
}
Код отрабатывает, но при нажатии на чекбокс, вместо ProgressBar зависает все приложение и в итоге прогрессбара я не вижу, а только лишь конечный результат.
Как сделать показ прогрессбара перед выполнением тяжелых функций и его убирание.
Ответы (1 шт):
Набросал простой пример. Почитайте про Task + async/await. Ваша тяжелая задача занимает время основного потока, что логично приводит к зависанию UI. Все тяжелые задачи выполняйте в отдельных потоках. Придерживайтесь правила - основной поток только для UI и легких задач, все тежелое выполняется в отдельных потоках(Task - отличный инструмент) Сразу предупреждаю, захотите что то изменять с UI внутри таска(а это отдельный поток) например наращивать прогресс в MainProgressBar, напрямую не получится. UI можно изменять только в основном потоке! Используйте ф-ю Invoke у контрола или формы и почитайте про Dispatcher
private async void CheckBox_Checked(object sender, RoutedEventArgs e)
{
MainProgressBar.Visibility = Visibility.Visible;
await Task.Run(()=>{
// Здесь функции, в которых я изменяю объекты на форме, например, создаю карту на бэкграунде
// Выполнение функций занимает более 1 минуты
});
MainProgressBar.Visibility = Visibility.Hidden;
}