Запустить загрузку пользовательского интерфейса в WPF при вызове web api?
Эй ребята,
еще один день, еще одна проблема.
В моем проекте (wpf, c#, framework 4.5) у меня есть окно входа в систему.
как обычно, он запрашивает имя пользователя и пароль.
после нажатия кнопки "Отправить" у меня есть:
1. метод, который проверяет, вводит ли пользователь имя пользователя, а также пароль.
2.если это так, вызовите веб-api (возвращается как json), чтобы получить сведения о пользователе и проверить, соответствует ли он имени пользователя и паролю.
иногда это занимает полсекунды, иногда-более 3 секунд.
во время этого 1 & 2 выше я хочу загрузить пользовательский элемент управления вызовами "LoadingAnimation", которые показывают обычную анимацию загрузки, как мы все ее знаем, и в то же время установить непрозрачность другой сетки (которая включает в себя остальную часть пользовательского интерфейса) на 0 (см.:"FadeOutGrid").
после получения результата из метода webApi я хочу установить сетку обратно на 1 (см.:"FadeInGrid") и удалить элемент управления" LoadingAnimation".
это код после нажатия кнопки Отправить:
private void btnLogIn_Click(object sender, RoutedEventArgs e) { ucLoading = new UserControls.LoadingAnimation(); ucLoading.Margin = new Thickness(0, 170, 0, 0); BackgroundWorker bw = new BackgroundWorker(); bw.DoWork += (sender2, evebtArgs2) => { this.Dispatcher.BeginInvoke((Action)(() => { EWStoryBoards.FadeOutGrid(grd, grdTransform); this.UpdateLayout(); grdFlip.Children.Add(ucLoading); this.UpdateLayout(); })); }; bw.RunWorkerAsync(); HandleLogin(); }
Это анимация:
public static void FadeOutGrid(Grid grd, TranslateTransform tt, Action completed = null, double SlideFromSec = 1, double SlideSpeed = 1.5, double OpacitySpeed = 5) { var animation = new DoubleAnimation(0, (Duration)TimeSpan.FromSeconds(1)); animation.SpeedRatio = OpacitySpeed; if (completed != null) animation.Completed += (o, e) => completed(); grd.BeginAnimation(UIElement.OpacityProperty, animation); } public static void FadeInGrid(Grid grd, Action completed = null, double SlideFromSec = 1, double SlideSpeed = 1.5, double OpacitySpeed = 5) { var animation = new DoubleAnimation(1, (Duration)TimeSpan.FromSeconds(1)); animation.SpeedRatio = OpacitySpeed; if (completed != null) animation.Completed += (o, e) => completed(); grd.BeginAnimation(UIElement.OpacityProperty, animation); }
Как я suppouse, чтобы сделать это? как я могу подтолкнуть загрузочный интерфейс даже на полсекунды?
Спасибо!
Что я уже пробовал:
....................................................................................................................................
Suvendu Shekhar Giri
Итак, в чем же проблема с вашим проверенным кодом?
oronsultan
Используя приведенную выше заметку, я получаю нужный мне результат. поскольку функция get webapi асинхронна и поскольку я использую фоновый рабочий для анимации загрузки, я путаюсь в том, что должно быть первым. мне нужно знать, как построить этот 2-й поток и все еще нажимать анимацию загрузки даже на полсекунды.
Jitesh Hirani
Пожалуйста, найдите ссылку ниже о том, как правильно использовать background worker. Возможно, это может дать вам лучший вариант для поиска/ реализации.
http://stackoverflow.com/questions/19334583/how-to-correctly-implement-a-backgroundworker-with-progressbar-updates