Обнаружение возврата на KeyDown - PullRequest
11 голосов
/ 27 октября 2011

Я работаю над веб-приложением 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 здесь не помогает, и все же я не могу получить возврат, чтобы вызвать tbMessage_KeyDow.

Я хочу каким-то образом вызвать функцию tbMessage_KeyDow из // этого места принудительно оттуда для возврата.

Я искал в MSDN и обнаружил, что IsInputKey можно переопределить, чтобы он возвращал значение true, чтобы onKeyDown также отвечал на него, но в My framework нет ни IsInputKey, ни PreviewKeyPress. Есть ли обходной путь для регистрации клавиши возврата назад в качестве клавиши ввода или для вызова tbMessage_KeyDow [это очень грубый подход]? Пожалуйста, помогите.

Ответы [ 3 ]

11 голосов
/ 27 октября 2011

попробуйте это ....

Если вы хотите обнаружить клавишу возврата на клавишу, нажатую в текстовом поле. мы предлагаем, чтобы вы попытались сделать это в событии 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;
        }
    }
}
1 голос
/ 09 июня 2018

Я искал нечто подобное для приложения 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;
    }
}
0 голосов
/ 27 октября 2011

Я хотел бы сделать что-то вроде этого (у меня нет 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» для ваших привязок.

...