我写一个C#WinForms应用程序,.NET 4.0。
我有一个WinForms Control
一对Form
。 用户开始使用键盘打字的东西后,另一个Control
出现。 这Control
是某种文字输入。 我想用户输入发送到Control
。 当然,它就会被集中后,它接收所有用户的键盘输入。 但是,随着用户开始输入之前Control
出现,我必须先通过KeyDown
事件到控制后,我调用它的Show
和Focus
的方法。
SendKeys.Send方法是在做类似的事情的一种方式。 但是,这是如此复杂,似乎是不安全的。 我只是一个价值Keys
从枚举KeyData
财产KeyEventArgs
,我想使用它,它不会转变成一些奇怪的字符串。
有没有通过什么好办法KeyDown
从一个控件到另一个事件?
任何原因,你不能在事件只是转嫁到了“子控件”? 下面的例子是按键响应,但同样的想法适用于的KeyDown
//Parent Control Visible
private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
richTextBox1_KeyPress(sender, e);
}
//Child Control Hidden
private void richTextBox1_KeyPress(object sender, KeyPressEventArgs e)
{
richTextBox1.Text += e.KeyChar.ToString();
}
您可以使用PreviewKeyDown
的Form
。
假设你想键盘输入发送到TextBox textBox1
:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
this.PreviewKeyDown+= Form1_OnPreviewKeyDown;
textBox1.Visible = false;
}
private bool _textboxEnable = false;
private void Form1_OnPreviewKeyDown(object sender, PreviewKeyDownEventArgs previewKeyDownEventArgs)
{
if (!_textboxEnable) textBox1.Visible = true;
if (!textBox1.Focused) textBox1.Focus();
}
}
你可以让这inherites的一个文本框的自定义控件。 你可以把该自定义控制来代替。 在这种自定义控件您可以编写调用它的方法:
public class MyTextBox : TextBox
{
public void TriggerKeyPress(KeyPressEventArgs e)
{
this.OnKeyPress(e);
}
}
如果你不想使用定制controlls的你可以扩展到文本框,并使用反射来调用它:
public static class TextBoxExtensions{
public static void TriggerKeyPress(this TextBox textbox, KeyPressEventArgs e)
{
MethodInfo dynMethod = textbox.GetType().GetMethod("OnKeyPress",
BindingFlags.NonPublic | BindingFlags.Instance);
dynMethod.Invoke(textbox, new object[]{ e });
}
}
但是这两种方法,你应该知道:这会不会从一个对象添加文本到另一个。 要做到这一点,你必须手动编写的代码。