C# 如何将System.Windows.Controls.TextBox输入重定向到流?

C# 如何将System.Windows.Controls.TextBox输入重定向到流?,c#,.net,textbox,stream,winforms,C#,.net,Textbox,Stream,Winforms,我试过: 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 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;
}
但这在字符删除和许多其他情况下都存在问题。
我该怎么办?

最简单的选择是使用
按键
而不是
按键

提供已正确翻译的实际字符。只需将这个字符直接写入流


编辑:

在注释中看到这是WPF,而不是Windows窗体(如标记所示)后,上述内容将不存在

话虽如此,我还是质疑你的目标——使用文本框以逐个字符的方式向流中写入数据总是有问题的。这是因为你在最后一句话中写道:

但这在字符删除和许多其他情况下都存在问题

就我个人而言,我会采取两种不同的方法之一:

  • 使用文本框作为“缓冲区”,仅在焦点丢失等情况下将全部内容发送到流。这样,用户可以根据需要删除等内容,并且您始终可以使用完整的“字符串”。这可能是我的第一个选择,如果你想让自己的行为与你现在所追求的相似的话

  • 不要为此使用文本框。使用其他一些允许文本输入但不允许删除或选择的控件。如果必须使用文本框,并且必须逐个键处理流式处理,则应将输入(通过行为或附加属性)仅限制为所需的字符,这意味着禁用删除


  • 我找不到
    按键
    。我使用的是WPF。我只找到了KeyDown和keydup。@Jader Dias:你的问题被标记为windows窗体,所以我假设的是windows窗体,而不是WPF……你知道WPF的解决方案吗?@Jader Dias:编辑了我的答案,并提供了一些建议。在文本框中,你可以处理PreviewtInput而不是TextInput,这是“…可能已经由内部执行部门处理…”