2016-12-05 3 views
0

Так что в моем визуальном проекте C# у меня есть TextBox, где отображается системный отклик, и я хочу, чтобы он отображался, добавляя символы один за другим, а не всю строку в одно и то же время. Я хочу создать иллюзию типизации.Windows Forms показывает строку буквами по буквам

Теперь у меня есть:

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

Но это один ждет все дано время, а затем выдает всю строку.

Что я делаю неправильно?

+4

«Thread.Sleep» блокирует поток пользовательского интерфейса, поэтому он не может обновляться. Попробуйте вместо «Task.Delay» вместо этого сделать ваш код async/await. – juharr

+0

Попробуйте использовать: backgroundworker –

ответ

3

Используйте асинхронность:

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

Не забудьте добавить async ключевое слово в область.

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

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; 
    } 
} 
+0

есть ли какой-либо аналог формы.Dispatcher.Invoke для winforms? – Coffee

+0

@YawningMilk обновленный ответ – tym32167

Смежные вопросы