-->

通过KeyDown事件到其他控制(Pass KeyDown event to other contr

2019-10-21 10:10发布

我写一个C#WinForms应用程序,.NET 4.0。

我有一个WinForms Control一对Form 。 用户开始使用键盘打字的东西后,另一个Control出现。 这Control是某种文字输入。 我想用户输入发送到Control 。 当然,它就会被集中后,它接收所有用户的键盘输入。 但是,随着用户开始输入之前Control出现,我必须先通过KeyDown事件到控制后,我调用它的ShowFocus的方法。

SendKeys.Send方法是在做类似的事情的一种方式。 但是,这是如此复杂,似乎是不安全的。 我只是一个价值Keys从枚举KeyData财产KeyEventArgs ,我想使用它,它不会转变成一些奇怪的字符串。

有没有通过什么好办法KeyDown从一个控件到另一个事件?

Answer 1:

任何原因,你不能在事件只是转嫁到了“子控件”? 下面的例子是按键响应,但同样的想法适用于的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();
}


Answer 2:

您可以使用PreviewKeyDownForm

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


Answer 3:

你可以让这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 });
    }
}

但是这两种方法,你应该知道:这会不会从一个对象添加文本到另一个。 要做到这一点,你必须手动编写的代码。



文章来源: Pass KeyDown event to other control