检测KeyDown上的退格

时间:2011-10-27 14:25:52

标签: c# .net textbox onkeydown

我正在开发一个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也响应它,但我的框架既没有IsInputKey也没有PreviewKeyPress。是否有一种解决方法可以将退格键注册为输入键,或调用tbMessage_KeyDow [这是非常粗略的方法]?请帮忙。

3 个答案:

答案 0 :(得分:11)

试试这个......

如果要检测文本框中按下的键上的退格键。我们建议你可以尝试在文本框的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 :(得分:1)

我正在寻找类似于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;
    }
}

答案 2 :(得分:0)

我会做这样的事情(我没有在我面前的VS所以这是纯粹的pseduo代码)

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; }
   }
}

..然后在视图中使用双向数据绑定,并记住在绑定上使用“PropertyChanged”的UpdateSourceTrigger。