所以在我的visual C#项目中我有一个TextBox
,其中显示了一个系统响应,我希望它显示为逐个添加字符,而不是同时添加整个字符串。我想创造某种打字错觉。
现在我有:
for (int i = 0; i <= response.Length; i++)
{
textBox2.Text = response.Substring(0, i);
Thread.Sleep(100);
}
但是这个等待整个给定时间然后发出整个字符串。
我做错了什么?
答案 0 :(得分:3)
使用异步:
for (int i = 0; i <= response.Length; i++)
{
textBox2.Text = response.Substring(0, i);
await Task.Delay(100);
}
不要忘记将async
关键字添加到范围。
答案 1 :(得分:1)
这只是样本(用WPF编写)如何实现这一目标。您可以轻松地将其用于winforms。
var form = new Window();
var tb = new TextBox();
form.Content = tb;
form.Show();
var str = "alk;lfkdsfj;slfhjs;idjhf;lksdjf;klsdjf;'lkjds;lfksd";
Task.Run(() =>
{
foreach (var c in str.ToCharArray())
{
Thread.Sleep(100);
form.Dispatcher.Invoke(() =>
{
tb.Text += c;
});
}
});
UPD。 对于Windows窗体,异步/等待答案可能是一个棘手而复杂的问题。但是,无论如何,我可以在没有异步的东西的情况下展示如何做到这一点
void Main()
{
var form = new MyForm();
form.Show();
}
class MyForm : Form
{
private TextBox tb;
public MyForm()
{
tb = new TextBox();
tb.Width = 300;
this.Controls.Add(tb);
var btn = new Button();
btn.Text = "go";
btn.Width = 300;
btn.Location = new System.Drawing.Point(0, 50);
this.Controls.Add(btn);
btn.Click += (sender, args) =>
{
tb.Text = string.Empty;
var str = "alk;lfkdsfj;slfhjs;idjhf;lksdjf;klsdjf;'lkjds;lfksd";
SetText d = SetTextToTb;
Task.Run(() =>
{
foreach (var c in str.ToCharArray())
{
Thread.Sleep(100);
tb.Invoke(d, c);
}
});
};
}
public delegate void SetText(char text);
void SetTextToTb(char text)
{
tb.Text += text;
}
}