将 KeyDown 事件传递给其他控件

本文关键字:其他 控件 KeyDown 事件 | 更新日期: 2023-09-27 18:34:31

我正在编写一个C# WinForms应用程序.NET 4.0。

我在Form上有一个WinForms Control。用户开始使用键盘键入内容后,将显示另一个Control。该Control是某种文本输入。我想将用户输入发送到该Control。当然,在它获得焦点后,它会接收所有用户的键盘输入。但是,当用户在Control出现之前开始键入时,我必须在调用该控件的ShowFocus方法后,首先KeyDown事件传递给该控件。

SendKeys.Send方法是一种执行类似操作的方法。但这太复杂了,而且似乎不安全。我只有一个来自KeyEventArgs属性Keys KeyData枚举的值,我想使用它,而不是将其转换为一些奇怪的字符串。

有什么好方法可以将KeyDown事件从一个控件传递到另一个控件吗?

将 KeyDown 事件传递给其他控件

您可以在

Form上使用PreviewKeyDown

假设您要将键盘输入发送到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();
    }
}

有什么理由你不能只将事件传递给"子控件"?下面的示例是按键,但同样的想法适用于按键

//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();
}

您可以创建一个继承文本框的自定义控件。您可以改为放置该自定义控件。在该自定义控件中,可以编写一个调用它的方法:

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

但是使用这两种方法,您应该知道:这不会将文本从一个对象添加到另一个对象。为此,您必须在代码中手动编写它。