我正在尝试创建一个WinForms程序,使得TextBox通常是隐藏的(Visible = false),直到用户开始在键盘上键入,此时TextBox应该变为可见,键盘输入应该进入TextBox
这是程序,简化为基本部分:
using System.Windows.Forms;
namespace TestTextEditPopup
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
this.KeyPreview = true;
textBox1.Visible = false;
}
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
if (keyData != Keys.Escape)
return base.ProcessCmdKey(ref msg, keyData);
textBox1.Visible = false;
return true; // Key has been processed
}
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
textBox1.Visible = true;
textBox1.Focus();
}
}
}
这是一系列的截图:
首先我点击键盘上的“a”。这确实会导致TextBox变得可见并获得焦点,但“a”显然在某处丢失了。
然后我击中了Esc。这正确地使TextBox再次不可见。
然后我点击“b”。这一次(以及所有,或至少几乎所有后续时间)它都可以工作 - TextBox变得可见,获得焦点,键盘输入不会丢失 - 它会显示在TextBox中。
有关为什么它第一次不起作用的任何建议?还是完成我想要做的事情的替代方法?
感谢。
编辑:只需将KeyPress添加为附加标记。
答案 0 :(得分:2)
使用表单上的KeyPress
事件;然后您可以访问角色数据,因此您可以将角色添加到TextBox
控件,然后将其聚焦:
private void Form1_KeyPress(object sender, KeyPressEventArgs e)
{
if (this.ActiveControl != textBox1)
{
textBox1.Visible = true;
textBox1.Focus();
textBox1.Text += e.KeyChar;
textBox1.Select(textBox1.Text.Length, 0);
e.Handled = true;
}
}
答案 1 :(得分:0)
当此属性设置为true时, 表单将接收所有KeyDown(etc)事件。之后 form的事件处理程序已经完成 处理击键, 然后将击键分配给 控制焦点。
表单启动时,文本框控件被禁用,因此没有焦点。
当按下第一个键时,文本框控件没有焦点,按键失败,因为表单无法处理它:在后续按键上,控件接收输入,因为它仍然有焦点 - 我猜它是表单上唯一的控件,因为如果有另一个控件,当文本框被禁用时焦点将转移到它,后续的按键将像初始按钮一样消失。
另一种方法是从表单边界外的文本框开始,然后将其移入和移出,而不是使其可见/不可见。