2014-03-06 3 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); 
    } 
} 

Мои TextBoxes изначально имеют набор меток, как их собственность .text. Когда пользователь нажимает на TextBox, я хочу, чтобы курсор переместился в начало, а затем, когда они начинают печатать, метка исчезает.

Это работает правильно, но проблема в том, когда я нажимаю ноль, TextBox заполняется «D0». Он также неправильно обрабатывает корпус, поэтому я добавил вызов ToLower. Я просто хочу, чтобы TextBox очистился, а затем отобразил точно, что пользователь постучал, с правильным случаем. Другие примеры того, как он работает неправильно, это то, что он отобразит «пробел», если я коснусь пробела.

Любые идеи?

ответ

1

Если бы я понял вас правильно - «Я просто хочу, чтобы TextBox очистился, а затем отобразил, что именно пользователь прослушивал, с правильным случаем». - вам не нужно обрабатывать событие KeyDown. Попробуйте использовать GotFocus InstEd:

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

Этот простой код выше будет очистить поле, когда пользователь начинает печатать. Вам не нужно обрабатывать KeyDown - TextBox заполняется автоматически, когда пользователь нажимает клавишу.

BTW - использование 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 получает фокус, я все еще хочу отображать метку. Поэтому текстовое поле Name будет по-прежнему содержать имя, пока оно не начнет печатать, и тогда мне нужно его очистить. Почему такая плохая практика? Это меня не смущает, и это означает, что мои переменные все еще капитализируются. – 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 (или вернусь к этому вопросу), чтобы получить верхнюю регистрационную клавиатуру (если я набираю текстовое поле с надписью «Имя»), он очищает текстовое поле, но отображает капитал «N». Я буду продолжать работать над этим. Еще раз спасибо.

EDIT

Это, кажется, установил ее, добавил к событию 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

Смежные вопросы