【问题标题】:Detection of Backspace on KeyDown检测 KeyDown 上的退格键
【发布时间】:2023-03-13 00:15:01
【问题描述】:

我正在开发一个 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 事件,因此我添加了以下代码 sn-p:

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。

我想以某种方式从 //this 地方强制调用 tbMessage_KeyDow 函数,以便退格。

我搜索了 MSDN,发现 IsInputKey 可以被覆盖返回 true 以便 onKeyDown 也响应它,但是我的框架既没有 IsInputKey 也没有 PreviewKeyPress。是否有将退格键注册为输入键或调用 tbMessage_KeyDow [这是非常粗略的方法] 的解决方法?请帮忙。

【问题讨论】:

  • 由于您使用this.tbMessage.Text.Length 退格和删除将反映在字符串Text 中。还是你的意思是别的?
  • 为什么不使用textchanged 事件来代替keydown?每次更改时只需计算文本框的内容
  • 谢谢。经过一番摆弄,TextChanged 起作用了。

标签: c# .net textbox onkeydown


【解决方案1】:

试试这个....

如果您想检测文本框中按下的键上的退格键。我们建议您可以尝试在文本框的 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;
        }
    }
}

【讨论】:

    【解决方案2】:

    我正在为 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;
        }
    }
    

    【讨论】:

      【解决方案3】:

      我会做这样的事情(我面前没有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; }
         }
      }
      

      ..然后从您的视图中使用两种方式的数据绑定,并记住在您的绑定上使用“PropertyChanged”的 UpdateSourceTrigger。

      【讨论】:

      • 谢谢,ViewModel 实现工作,事实上我以前做过很多次。我试图避免在 View.cs 中使用额外的代码
      猜你喜欢
      • 2019-02-07
      • 2010-12-30
      • 2018-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多