oronsultan Ответов: 0

Запустить загрузку пользовательского интерфейса в 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

0 Ответов