17

我正在开发一个 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。

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

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

4

3 回答 3

13

尝试这个 ....

如果要检测文本框中按下的键上的退格键。我们建议您可以尝试在文本框的 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;
        }
    }
}
于 2011-10-27T14:36:00.267 回答
4

我正在为 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;
    }
}
于 2018-06-09T00:34:14.670 回答
0

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

于 2011-10-27T18:42:13.693 回答