2011-11-14 2 views
1

Я хочу, чтобы мое приложение отображало текст в текстовом блоке по буквам, а не весь текст один раз.Анимация текстового отображения на текстовом блоке WP7

я попытался сделать следующее:

 textBlock1.Text=""; 
     for (int i = 0; i < s.Length; i++) 
     { 
      DateTime t = DateTime.Now; 
      textBlock1.Text += s[i].ToString(); 
      while (DateTime.Now < t.Add(new TimeSpan(0, 0, 0, 0, 500))) ; 
     } 

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

Я думаю, что есть автоматизированный буфер или что-то, чтобы предотвратить это.

Как я могу это решить?

ответ

2

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

for (int i = 1; i <= s.Length; i++) 
{ 
    string partialText = s.Substring(0, i); 
    Dispatcher.DelayInvoke(TimeSpan.FromMilliseconds(500*i), 
          new Action(() => 
          { 
           textBlock1.Text = partialText; 
          })); 
} 

С DelayInvoke() является метод расширения для Dispatcher:

public static class DispatcherHelper 
{ 
    public static void DelayInvoke(this Dispatcher dispatcher, TimeSpan ts, Action action) 
    { 
     DispatcherTimer delayTimer = new DispatcherTimer(); 
     delayTimer.Interval = ts; 
     delayTimer.Tick += (s, e) => 
     { 
      delayTimer.Stop(); 
      action(); 
     }; 
     delayTimer.Start(); 
    } 
} 
+0

DispatcherPriority Enum не поддерживается в WP7 – SKandeel

+0

Я сделал это таким образом, DispatcherTimer delayTimer = new DispatcherTimer(); – SKandeel

+1

@SherifMaherEaid: Исправлен вызов конструктора – BrokenGlass

Смежные вопросы