【问题标题】:How to redirect a System.Windows.Controls.TextBox input to a stream?如何将 System.Windows.Controls.TextBox 输入重定向到流?
【发布时间】:2010-02-15 18:31:23
【问题描述】:

我试过了:

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

但我不知道如何正确地将 Key 转换为字符串。我也试过了:

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

但这在字符删除和许多其他情况下都有问题。 我该怎么办?

【问题讨论】:

标签: c# .net textbox stream winforms


【解决方案1】:

最简单的选择是使用KeyPress 而不是KeyDown

KeyPressEventArgs.KeyChar 提供了实际的字符,已经正确翻译。只需将此字符直接写入您的流。


编辑:

在 cmets 中看到这是 WPF,而不是 Windows 窗体(已标记)后,上述内容将不存在。

话虽如此,我在这里质疑您的目标 - 使用文本框以逐个字符的方式写入流,总是会有问题。这是由于你在最后一句话中写的:

但这有字符删除的问题,以及许多其他情况。

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

  1. 使用 TextBox 作为“缓冲区”,仅在失去焦点等时将整个内容发送到流中。这样,用户可以根据需要删除等,并且您始终拥有一个完整的“字符串”可以使用。如果您希望行为类似于您现在所追求的,这可能是我的首选。

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

【讨论】:

  • 我找不到KeyPress。我正在使用 WPF。
  • 我只找到了 KeyDown 和 KeyUp。
  • @Jader Dias:你的问题被标记为 windows-forms,所以我假设是 Windows Forms,而不是 WPF...
  • 你知道WPF的解决方案吗?
  • @Jader Dias:用建议编辑了我的答案。
猜你喜欢
  • 1970-01-01
  • 2021-04-29
  • 1970-01-01
  • 1970-01-01
  • 2011-03-08
  • 2018-03-25
  • 2013-01-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多