2015-04-01 4 views
0

Я занимаюсь разработкой «Универсальное приложение» для ОС Windows 8.1 и Windows Phone 8,1ProgressRing не отображается в то время как приложение работает

Мне нужно добавить ProgressRing контроль на мою страницу, потому что есть задача, которая занимает некоторое время для завершения, и я должен уведомить пользователя о том, что приложение загружает данные. Так что я следовал инструкции по MDSN в следующей ссылке:

To create an indeterminate progress ring и они заявили, что я точно нужно:

4. Добавление неопределенную прогресс кольцо

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

Проблема заключается в том, что ProgressRing не играет анимации «загрузки», когда я вставляю prog.IsActive = true; перед кодом, который запускает задачу

Если я комментирую Целевую строк кода, он играет.

XAML:

<ProgressRing x:Name="prog" Margin="435,349,388,181" FontFamily="{StaticResource FontFamily6}" FontSize="25" /> 

C#:

private void LevelTap(object sender, TappedRoutedEventArgs e) 
    { 
     prog.IsActive = true; 
     CheckNav(sender); 
    } 

private void CheckNav(object sender) 
    { 
     TextBlock tb = sender as TextBlock; 
     GameSetter game = new GameSetter(); 
     game.Level = (int)TextDict[tb]; 
     if (!LevelsArr[game.Level]) return; 
     if (!goToLeader) 
     {    
      prog.IsActive = false; 
      CallNav(true, game); 
     } 
     else 
     { 
      prog.IsActive = false; 
      CallNav(false, game); 
     }  
    } 

    private void CallNav(bool b,GameSetter g) 
    { 
     if(b) Frame.Navigate(typeof(Game8), g); 
     else Frame.Navigate(typeof(MainPage), g); 
    } 

Примечание: задача, которая работает использует Dictionary, Windows.Storage.ApplicationData и Navigation на другую страницу, в конце концов.

+0

гул, позвольте мне угадать, 'GameSetter game = new GameSetter();' занимает значительное количество времени, не так ли? – kennyzx

+0

@kennyzx не совсем, конструктор ничего не делает на самом деле, и у него есть только 3 пропозиции. – GabourX

+0

поэтому после того, как вы запустите кольцо прогресса, вы сразу же остановите его, установив 'prog.IsActive = false;' - поскольку, похоже, нет времени, требующего много времени. – kennyzx

ответ

1

Недостаток в вашем коде (за исключением того факта, что он, вероятно, почти мгновен в любом случае, как примечания @kennyzx), заключается в том, что вам нужен метод LevelTap для возврата к обновлению пользовательского интерфейса. И когда метод вернется, вы уже установили свойство ProgressRing.IsActive в значение false, что означает, что ничего не отображается вообще.

Один простой способ исправить это использовать Асинхронный Task.Yield метод, чтобы дать UI нить возможность запуска:

private async void LevelTap(object sender, TappedRoutedEventArgs e) 
{ 
    prog.IsActive = true; 

    await Task.Yield(); 

    CheckNav(sender); 
} 

Но почти ничего не будет показано, что ваш код не займет много времени, чтобы выполнить , Если вы действительно хотите, чтобы заставить индикатор, который будет отображаться в течение 0,5 секунд, вы можете сделать что-то вроде:

private async void LevelTap(object sender, TappedRoutedEventArgs e) 
{ 
    prog.IsActive = true; 

    await Task.Delay(500); 

    CheckNav(sender); 
} 
+0

вы двое не понимали, что я пытался сказать, 0,5 секунды - это время ожидания приложения, чтобы оно могло запустить задачу, поэтому потребуется 0,5 секунды + время задачи = (примерно 3 секунды), i думаю, разумно сделать «ProgressRing» за такой период – GabourX

+0

@GabourX Я вижу. Затем «Task.Yield» решает вашу проблему? –

+0

в моем приложении uwp прекрасно работает на рабочем столе, но на мобильном телефоне вместо того, чтобы показывать кольцо, отображается пустая страница. –

2

Вы можете использовать этот блок кода в каждой функции тоже, если Прогрессирующие неопределенный режим всегда открыто:

#region Progress Ring Start 
      await Dispatcher.RunAsync(CoreDispatcherPriority.Normal,() => 
      { 
       Waiter.Visibility = Visibility.Visible; // Progress ring name is Waiter. 
      }); 

      #endregion 
      await Task.Delay(1000); 
      CheckNav(sender); // Your process 



      #region Progress Ring Finish 
      await Dispatcher.RunAsync(CoreDispatcherPriority.Normal,() => 
      { 
       Waiter.Visibility = Visibility.Collapsed; // Progress ring name is Waiter. 

      }); 
      #endregion 
Смежные вопросы