Как перенаправить ввод System.Windows.Controls.TextBox в поток? - PullRequest
1 голос
/ 15 февраля 2010

Я пытался:

private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
    streamWriter.Write(e.Key.ToString());
}

Но я не знаю, как правильно преобразовать Ключ в строку. Я также попробовал:

private void textBox1_TextInput(object sender, TextCompositionEventArgs e)
{
    streamWriter.Write(e.Text);
}

Но это событие не называется. Самое дальнее, что я прошел, было:

private string previous = string.Empty;
private void textBox1_TextChanged(object sender, TextChangedEventArgs e)
{
    var text = textBox1.Text.Substring(previous.Length);
    streamWriter.Write(text);
    previous = textBox1.Text;
}

Но это имеет проблемы с удалением символов и во многих других случаях. Что мне делать?

1 Ответ

2 голосов
/ 15 февраля 2010

Самый простой вариант - использовать KeyPress вместо KeyDown.

KeyPressEventArgs.KeyChar предоставляет фактический символ, уже переведенный соответствующим образом. Просто напишите этот символ прямо в свой поток.


Edit:

После того, как вы увидели в комментариях, что это WPF, а не Windows Forms (как помечено), вышеприведенного не будет.

При этом я ставлю под сомнение вашу цель - использование текстового поля для записи в поток, символ за символом, всегда будет проблематичным. Это связано с тем, что вы написали в своем последнем предложении:

Но это имеет проблемы с удалением символов и во многих других случаях.

Лично я бы выбрал один из двух разных подходов:

  1. Используйте TextBox в качестве «буфера» и отправляйте все содержимое в поток только при потере фокуса и т. Д. Таким образом, пользователь может удалять и т. Д. По мере необходимости, и у вас всегда есть завершить «строку» для работы. Вероятно, это будет мой первый выбор, если вы хотите, чтобы поведение было похоже на то, что вам нужно сейчас.

  2. Не используйте TextBox для этого. Используйте другой элемент управления, который позволяет вводить текст, но не удалять или выделять. Если вы должны использовать TextBox и обрабатывать потоковую передачу «ключ за ключом», то вы должны ограничить ввод (с помощью поведения или присоединенного свойства) только тем символом, который вам нужен, что означает отключение удаления.

...