Windows窗体逐字母显示字符串

时间:2016-12-05 18:26:35

标签: c# winforms sleep

所以在我的visual C#项目中我有一个TextBox,其中显示了一个系统响应,我希望它显示为逐个添加字符,而不是同时添加整个字符串。我想创造某种打字错觉。

现在我有:

for (int i = 0; i <= response.Length; i++)
{
    textBox2.Text = response.Substring(0, i);
    Thread.Sleep(100);
}

但是这个等待整个给定时间然后发出整个字符串。

我做错了什么?

2 个答案:

答案 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;
    }
}