Анимация текста на текстовом блоке WP7 - PullRequest
1 голос
/ 14 ноября 2011

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

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

        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))) ;
        }

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

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

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

1 Ответ

2 голосов
/ 14 ноября 2011

Вам нужно запланировать, чтобы ваше обновление пользовательского интерфейса выполнялось в потоке Dispatcher, ваше текущее обновление, как вы заметили, будет выполняться синхронно как блок, который замораживает пользовательский интерфейс, пока ваше обновление не будет полностью завершено.Вместо этого вы можете использовать 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();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...