2011-10-27 10 views
8

私は銀色のWebアプリケーションで作業しています。これは、SMSを送信するモジュールと対話します。私はテキストを160に制限し、カウンタを表示したいと思います。私はこのようにしました:KeyDownでのバックスペースの検出

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イベントを試してみました:私はすべてのキーストロークが登録取得は、OnKeyDown機能で

public class CustomTextBox : TextBox 
{ 
    public CustomTextBox(): base() 
    { 
    } 

    protected override void OnKeyDown(KeyEventArgs e) 
    { 
     e.handler=false; 
     base.OnKeyDown(e); 
     //this place 
    } 
} 

を。ここではハンドラをfalseに設定するとヘルプが表示されず、バックスペースでtbMessage_KeyDowをトリガすることはできません。

私は何とかtbMessage_KeyDow関数をバックスペースに対して強制的にここから//呼び出す必要があります。

MSDNを検索して、IsInputKeyをtrueに戻すようにオーバーライドして、onKeyDownにも応答するようにすることができますが、MyフレームワークにはIsInputKeyもPreviewKeyPressもありません。バックスペースキーを入力キーとして登録するか、tbMessage_KeyDowを呼び出すための回避策がありますか?助けてください。

+0

'this.tbMessage.Text.Length'バックスペースを使用しているので、削除は文字列' Text'に反映されます。それとも別の意味ですか? – Stefan

+1

keydownの代わりに[textchanged](http://msdn.microsoft.com/en-us/library/system.windows.controls.textbox.textchanged%28v=vs.95%29.aspx)イベントを使用しないでください。変更されるたびにテキストボックスの内容を数えるだけです – weberik

+0

ありがとうございます。 TextChangedはちょっとした手間をかけて作業しました。 – whizzyifti

答えて

8

はこれを試して....

あなたがテキストボックスに押されたキーのバックスペースキーを検出します。 KeyDownイベントではなく、テキストボックスのKeyUpイベントで行うことをお勧めします。例えば :

<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; 
     } 
    } 
} 
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を使用することを忘れないでください。

+0

ありがとう、ViewModelの実装は、実際には何度もやったことがあります。私はView.csでそれを動作させる余分なコードを避けようとしていました – whizzyifti