2011-02-01 33 views
0

我試圖製作一個WinForms程序,使得TextBox通常隱藏(Visible = false),直到用戶開始在鍵盤上鍵入,此時TextBox應該變爲可見並且鍵盤輸入應該進入TextBox。WinForms KeyDown事件在第一次使用時丟失鍵盤輸入

這裏的程序,減少到了關鍵部分:

using System.Windows.Forms; 

namespace TestTextEditPopup 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
     InitializeComponent(); 

     this.KeyPreview = true; 
     textBox1.Visible = false; 
     } 

     protected override bool ProcessCmdKey(ref Message msg, Keys keyData) 
     { 
     if (keyData != Keys.Escape) 
      return base.ProcessCmdKey(ref msg, keyData); 

     textBox1.Visible = false; 
     return true; // Key has been processed 
     } 

     private void Form1_KeyDown(object sender, KeyEventArgs e) 
     { 
     textBox1.Visible = true; 
     textBox1.Focus(); 
     } 
    } 
} 

這裏還有一系列的屏幕截圖:

And here's a series of screen shots

首先我打 「A」 在鍵盤上。這會導致TextBox變得可見並獲得焦點,但「a」顯然在某處丟失。

然後我打Esc。這正確地使TextBox再次不可見。

然後我打「b」。這一次(以及至少幾乎所有的後續時間)它的工作原理 - TextBox變得可見,獲得焦點,並且鍵盤輸入不會丟失 - 它出現在TextBox中。

任何建議,爲什麼它不是第一次工作?或者我想要做什麼的其他方法?

謝謝。

編輯:只需添加KeyPress作爲附加標籤。

回答

2

改爲在表單上使用KeyPress事件;然後您可以訪問字符數據,這樣你就可以將字符添加到TextBox控制,然後集中它:

private void Form1_KeyPress(object sender, KeyPressEventArgs e) 
{ 
    if (this.ActiveControl != textBox1) 
    { 
     textBox1.Visible = true; 
     textBox1.Focus(); 
     textBox1.Text += e.KeyChar; 
     textBox1.Select(textBox1.Text.Length, 0); 
     e.Handled = true; 
    }     
} 
0

docs for KeyPreview

當此屬性設置爲true,則 表單將收到所有KeyDown(等)事件。 表單的事件處理程序完成 處理鍵擊後, 鍵擊然後被分配給具有焦點的 控件。

當窗體開始時,文本框控件被禁用,因此沒有焦點。

當第一個鍵被按下時,文本框控件沒有焦點,按鍵會丟失,因爲表單無法處理它:在隨後的按鍵上,控件接收到輸入,因爲它仍然有焦點 - 我在猜測它是窗體上唯一的控件,因爲如果有另一個控件,當文本框變爲禁用時,焦點會轉移到它,隨後的按鍵會像最初的那樣消失。

這樣做的另一種方法是從窗體邊界之外的文本框開始,並將其移入和移出,而不是使其可見/不可見。

相關問題