我希望我的应用程序能够逐字地将文本显示为文本块,而不是整个文本。
我尝试执行以下操作:
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))) ;
}
问题是等待整个时间过去,然后它会显示整个文本一次。
我认为有一个自动缓冲区可以防止这样做。
我该如何解决?
答案 0 :(得分:2)
您需要安排在Dispatcher线程上执行UI更新,您注意到的当前更新将作为一个块同步执行,这将冻结UI,直到您的更新完全完成。相反,您可以使用DispatcherTimer
逐个字母地异步更新UI,即借助扩展方法:
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();
}
}