2011-10-27 66 views
8

我正在研究Silverlight Web應用程序。它與發送SMS的模塊進行交互。我想限制文本到160並顯示一個計數器。我這樣做:KeyDown上的Backspace檢測

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事件的功能我得到的所有的擊鍵記錄。在這裏設置處理程序爲false不起作用,仍然無法取消退格鍵來觸發tbMessage_KeyDow。

我想以某種方式從/強制從這裏退出的位置調用tbMessage_KeyDow函數。

我搜索了MSDN,發現IsInputKey可以重寫爲true,以便onKeyDown也能對此做出響應,但是我的框架既沒有IsInputKey也沒有PreviewKeyPress。有沒有一種解決方法可以將退格鍵註冊爲輸入鍵,或者調用tbMessage_KeyDow [這是非常粗糙的方法]?請幫忙。

+0

由於您正在使用'this.tbMessage.Text.Length'退格,並且刪除將反映在字符串'Text'中。或者你的意思是別的嗎? – Stefan

+1

爲什麼不使用[textchanged](http://msdn.microsoft.com/en-us/library/system.windows.controls.textbox.textchanged%28v=vs.95%29.aspx)事件代替keydown?只是計算每次更改文本框的內容 – weberik

+0

謝謝。 TextChanged工作後,一小會兒擺弄。 – whizzyifti

回答

8

試試這個....

如果要檢測在一個文本框,按下鍵退格鍵。我們建議您可以嘗試在文本框的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; 
     } 
    } 
} 
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