2014-03-06 77 views
0

我有以下功能:使用KeyDown事件正確

private void TextBox_KeyDown(object sender, System.Windows.Input.KeyEventArgs e) 
{ 
    TextBox TextBox = (TextBox)sender; 

    if (TextBox.Text == "Name" || 
     TextBox.Text == "E-mail address" || 
     TextBox.Text == "Confirm e-mail" || 
     TextBox.Text == "Mobile number" || 
     TextBox.Text == "Password") 
    { 
     TextBox.Foreground = new SolidColorBrush(Colors.Black); 

     TextBox.Text = e.Key.ToString().ToLower(); 
     TextBox.Select(1, 0); 
    } 
} 

我的文本框最初有一個標籤設置爲自己的財產。文本。當用戶點擊文本框時,我希望光標移動到開始位置,然後當他們開始輸入時,標籤消失。

這工作正常,但問題是當我點擊零時,文本框中填充了「D0」。它也不能正確處理外殼,這就是爲什麼我添加了ToLower調用。我只想讓TextBox自行清除,然後正確顯示用戶點擊的內容。其它如何工作不正常的例子是,如果我點擊空格鍵,它會顯示「空格」。

任何想法?

回答

1

如果我已經正確理解了你 - '我只是希望文本框清除自己,然後正確顯示用戶點擊的內容。 - 你不需要處理KeyDown事件。嘗試使用GotFocus insted的:

myTextBox.GotFocus += (s, e) => 
{ 
    myTextBox.Text = ""; 
}; 

這個簡單的代碼上面會清除該字段,當用戶開始輸入。您無需處理KeyDown - 當用戶按下按鍵時,文本框會自動填充。

順便說一句 - 使用TextBox作爲TextBox的名稱是一種非常糟糕的做法。

編輯 - 評論後

那麼也許這將是足夠的:

private bool toClear = false; 
public MainPage() 
{ 
    InitializeComponent(); 
    myTextBox.GotFocus += (s, e) => 
     { 
     myTextBox.SelectionStart = 0; 
     toClear = true; 
     }; 
    myTextBox.KeyUp+=myTextBox_KeyUp; 
} 

private void myTextBox_KeyUp(object sender, System.Windows.Input.KeyEventArgs e) 
{ 
    if (toClear) 
    { 
     myTextBox.Text = myTextBox.Text.Substring(0, 1); 
     myTextBox.SelectionStart = 1; 
     toClear = false; 
    } 
} 
+0

謝謝,但我不能這樣做,因爲當TextBox獲得焦點時,我仍然想顯示標籤。因此,名稱文本框將仍然包含名稱,直到他們開始輸入,這是我需要清除它的時間。爲什麼這種做法很糟糕?它不會讓我困惑,這意味着我的變量仍然是大寫的。 – xceed

+1

這是不好的做法,因爲你可能有很多文本框,這會讓你感到困惑。我用於文本框的標準做法是將「tb」追加到文本框所包含的前面。例如,tbName,tbEmail,tbPhone等......這樣就沒有混淆的餘地,你知道它是什麼類型的控制,它包含了什麼樣的一般類型的數據。 –

+0

@xceed所以我已經添加了一個符合你需求的編輯。 TextBox是一個類的類型,它應該被用作它,否則你會看到在你的代碼中會產生很多混亂。請注意,一個類可以有一個靜態方法/變量,你將訪問MyClass.Variable - 你不需要一個對象。 – Romasz

0
private bool ClearTextBox = false; 
    private void TextBox_GotFocus(object sender, RoutedEventArgs e) 
    { 
     TextBox tbSender = (TextBox)sender; 

     if (tbSender.Text == "Name" || 
      tbSender.Text == "E-mail address" || 
      tbSender.Text == "Confirm e-mail" || 
      tbSender.Text == "Mobile number" || 
      tbSender.Text == "Password") 
     { 
      tbSender.Foreground = new SolidColorBrush(Colors.LightGray); 

      tbSender.Select(0, 0); 
      tbSender.SelectionStart = 0; 

      ClearTextBox = true; 
     } 
     else 
     { 
      tbSender.Select(tbSender.Text.Length, 0); 
     } 
    } 


    private void TextBox_KeyUp(object sender, System.Windows.Input.KeyEventArgs e) 
    { 
     TextBox tbSender = (TextBox)sender; 

     if (ClearTextBox) 
     { 
      tbSender.Foreground = new SolidColorBrush(Colors.Black); 

      tbSender.Text = tbSender.Text.Substring(0, 1); 

      tbSender.SelectionStart = 1; 

      ClearTextBox = false; 
     } 
    } 

感謝您的幫助Romasz和你的代碼示例,它是如此,如果現在我固定我最初的問題點擊空格或零,它會用「'或'0'填充文本框,太好了。

我唯一的問題是,如果我按Shift(或返回該事件)來獲取大寫鍵盤(如果我在具有標籤'Name'的文本框中鍵入),它會清除文本框,但會顯示大寫'N'。我會繼續努力的。再次感謝。

編輯

這似乎已經固定它,加入到KeyUp事件。

 string KeyString = e.Key.ToString(); 

     if (KeyString == "Shift" || KeyString == "Enter") 
     { 
      return; 
     } 
+0

它將解決下一個問題,因爲會阻止TexBox被清除(您還應該處理其他鍵)。它可以更容易地完成:'if(e.Key == Key.Shift || e.Key == Key.Enter)return;'。很好,你能解決所有問題。當它可用時,請不要忘記將答案標記爲解決方案,以便它不再無法解決。 – Romasz

+0

謝謝,那更好。 – xceed