Обнаружение возврата на KeyDown
Я работаю над веб-приложением Silverlight. Он взаимодействует с модулем, который отправляет SMS. Я хочу ограничить текст до 160 и показать счетчик. Я сделал это так:
public partial class SendSMSView
{
public SendSMSView()
{
InitializeComponent();
ApplyTheme();
}
protected void tbMessage_KeyDown(object sender, KeyEventArgs e)
{
count = 160 - this.tbMessage.Text.Length;
this.lblCount.Content = count.ToString();
}
}
Это прекрасно работает для всех клавиш, кроме возврата и удаления. Конечно, это сделано, чтобы функционировать так. я выкопал больше об этом и попытался переопределить событие keydown, поэтому я добавил следующий фрагмент кода:
public class CustomTextBox : TextBox
{
public CustomTextBox(): base()
{
}
protected override void OnKeyDown(KeyEventArgs e)
{
e.handler=false;
base.OnKeyDown(e);
//this place
}
}
В функции OnKeyDown я регистрирую все нажатия клавиш. Установка Handler в false здесь не помогает, и все же я не могу получить backspace, чтобы вызвать tbMessage_KeyDow.
Я хочу как-то вызвать функцию tbMessage_KeyDow из // этого места принудительно оттуда для возврата.
Я искал MSDN и обнаружил, что IsInputKey можно переопределить, чтобы он возвращал значение true, чтобы onKeyDown также отвечал на него, но в моей инфраструктуре нет ни IsInputKey, ни PreviewKeyPress. Есть ли обходной путь для регистрации клавиши возврата назад в качестве клавиши ввода или для вызова tbMessage_KeyDow [это очень грубый подход]? Пожалуйста помоги.
3 ответа
Попробуй это....
Если вы хотите обнаружить клавишу возврата на клавишу, нажатую в текстовом поле. мы предлагаем, чтобы вы попытались сделать это в событии KeyUp текстового поля вместо события KeyDown. например:
<TextBox x:Name="txt" KeyDown="txt_KeyDown" Text="Hello" KeyUp="txt_KeyUp"></TextBox>
код позади:
private void txt_KeyUp(object sender, KeyEventArgs e)
{
if (e.Key == Key.Back)
{
MessageBox.Show(this.txt.Text);
}
}
или вы можете сделать это... создав пользовательский элемент управления....
public partial class Page : UserControl {
private TextBox TextBox1;
public Page() {
InitializeComponent();
TextBox1 = new TextBox();
Width = 300;
Height = 100;
LayoutRoot.Children.Add(textbox);
OnTextChanged(((object)(sender)), ((TextChangedEventArgs)(e)));
TextBox1.TextChanged;
if (e.Key == Key.Back) {
e.Handled = true;
}
else if (e.Key == Key.Delete) {
e.Handled = true;
}
}
}
Я искал что-то подобное для приложения WPF, клавиши Backspace и Delete не были обнаружены событием KeyDown. Событие KeyUp не было работоспособным, потому что оно будет перехватывать нажатие клавиши ПОСЛЕ того, как действие уже произошло.
Однако обнаружил, что событие PreviewKeyDown работает для захвата нажатия клавиш, чтобы я мог предотвратить его нажатие, например, так:
private void txtRight_PreviewKeyDown(object sender, KeyEventArgs e)
{
if ((e.Key == Key.Delete) || (e.Key == Key.Back))
{
// Stop the character from being entered into the control since it is illegal.
e.Handled = true;
}
}
Я хотел бы сделать что-то вроде этого (у меня нет VS передо мной, так что это чистый псевдо-код)
public class SendSMSViewModel : INotifyPropertyChanged
{
string _text;
public string Text
{
get { return _text; }
set {
// or allow it and implement IDataErrorInfo to give the user a nifty error message
if (value != null & value.Length > 160)
return;
_text = value;
OnPropertyChanged(vm => vm.Text);
OnPropertyChanged(vm => vm.NumberOfCharactersRemaining);
}
}
public string NumberOfCharactersRemaining
{
get { return Text == null ? 160 : 160 - Text.Length; }
}
}
..и затем используйте двустороннюю привязку данных из своего представления и не забудьте использовать UpdateSourceTrigger "PropertyChanged" для ваших привязок.