首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >KeyDown中的退格检测

KeyDown中的退格检测
EN

Stack Overflow用户
提问于 2011-10-27 22:25:52
回答 3查看 24.7K关注 0票数 17

我正在开发一个silverlight web应用程序。它与发送短信的模块交互。我想将文本限制为160,并显示一个计数器。我是这样做的:

代码语言:javascript
复制
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();
    }
}

这对除backspace和delete之外的所有键都很有效。当然,它的功能是这样的。我深入研究了这一点,并尝试重写keydown事件,因此我添加了以下代码片段:

代码语言:javascript
复制
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,这是非常粗糙的方法?请帮帮忙。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-10-27 22:36:00

试试这个..。

如果要检测在文本框中按下的键上的退格键。我们建议您可以尝试在textbox的KeyUp事件而不是KeyDown事件中执行此操作。例如:

代码语言:javascript
复制
   <TextBox x:Name="txt" KeyDown="txt_KeyDown" Text="Hello" KeyUp="txt_KeyUp"></TextBox>    

代码背后:

代码语言:javascript
复制
    private void txt_KeyUp(object sender, KeyEventArgs e)
    {
        if (e.Key == Key.Back)
        {
            MessageBox.Show(this.txt.Text);
        }
    } 

或者你可以像this...by一样创建一个用户控件……

代码语言:javascript
复制
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;
        }
    }
}
票数 13
EN

Stack Overflow用户

发布于 2018-06-09 08:34:15

我正在为一个WPF应用程序寻找类似的东西,KeyDown事件没有捕捉到退格键和Delete键。KeyUp事件不可用,因为它将在操作发生后捕获按键。

但是,我发现PreviewKeyDown事件可以捕获按键,这样我就可以防止按键发生,如下所示:

代码语言:javascript
复制
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;
    }
}
票数 4
EN

Stack Overflow用户

发布于 2011-10-28 02:42:14

我会这样做(我前面没有VS,所以这是纯pseduo代码)

代码语言:javascript
复制
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; }
   }
}

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7917388

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档