簡體   English   中英

將KeyDown事件傳遞給其他控件

[英]Pass KeyDown event to other control

我正在編寫一個C#WinForms應用程序.NET 4.0。

我在Form上有一個WinForms Control 用戶開始使用鍵盤鍵入內容后,將出現另一個Control Control是某種文本輸入。 我想向該Control發送用戶輸入。 當然,在集中精力之后,它將接收所有用戶鍵盤輸入。 但是隨着用戶在Control出現之前開始鍵入內容,我必須在調用ShowFocus方法后將第一個KeyDown事件傳遞給該控件。

SendKeys.Send方法是一種執行類似操作的方法。 但這是如此復雜,並且似乎是不安全的。 我只有KeyEventArgs KeyData屬性的Keys枚舉值,我想使用它,而不是將其轉換為一些奇怪的字符串。

有什么好的方法可以將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();
    }
}

有什么理由不能將事件傳遞到“子控件”上? 下面的例子是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();
}

您可以創建一個繼承文本框的自定義控件。 您可以放置​​該自定義控件。 在該自定義控件中,您可以編寫一個調用它的方法:

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

但是使用這兩種方法,您應該知道:這不會將文本從一個對象添加到另一個對象。 為此,您必須手動將其編寫在代碼中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM