我正在编写一个C#WinForms应用程序,.NET 4.0。
我在Control
上有一个WinForms Form
。用户开始使用键盘输入内容后,会出现另一个Control
。 Control
是某种文本输入。我想将用户输入发送到Control
。当然,在它聚焦后,它会接收所有用户键盘输入。但是,当用户在显示Control
之前开始输入时,我必须先将KeyDown
事件传递给该控件,我将其称为Show
和Focus
方法。
SendKeys.Send method是一种做类似事情的方式。但这太复杂了,似乎不安全。我只有来自Keys
KeyData
属性的KeyEventArgs
枚举值,我想使用它,而不是将其转换为某个奇怪的字符串。
有没有什么好方法可以将KeyDown
事件从一个控件传递到另一个控件?
答案 0 :(得分:3)
您可以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();
}
}
答案 1 :(得分:2)
您无法将该事件传递给"子控件" ?下面的示例是KeyPress,但同样的想法适用于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();
}
答案 2 :(得分:0)
您可以创建一个继承文本框的自定义控件。你可以放置那个自定义控件。在该自定义控件中,您可以编写一个调用它的方法:
public class MyTextBox : TextBox
{
public void TriggerKeyPress(KeyPressEventArgs e)
{
this.OnKeyPress(e);
}
}
如果您不想使用自定义控件,可以对文本框进行扩展并使用反射来调用它:
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 });
}
}
但是使用这两种方法你应该知道:这不会将文本从一个对象添加到另一个对象。为此,您必须手动在代码中编写它。