[英]Pass KeyDown event to other control
我正在編寫一個C#WinForms應用程序.NET 4.0。
我在Form
上有一個WinForms Control
。 用戶開始使用鍵盤鍵入內容后,將出現另一個Control
。 該Control
是某種文本輸入。 我想向該Control
發送用戶輸入。 當然,在集中精力之后,它將接收所有用戶鍵盤輸入。 但是隨着用戶在Control
出現之前開始鍵入內容,我必須在調用Show
和Focus
方法后將第一個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.