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