2009-05-22 9 views
3

バックスペースキーダウンイベントをトラップするためのテキストボックスkeydownイベントを取得しようとしています。私は、テキストボックスをオーバーライドするクラスを追加して作業しています。私は、テキストボックスがユーザコントロール内にあるクラスと通信する必要があるのです。Silverlight textboxオーバーライド

ユーザーがテキストボックスに... abcdまたはbackspaceと入力すると、私はusercontrolで何かを更新する必要があります。テキストボックスにいくつの文字が表示されているかを表示したいとしましょう。誰かが私にそれを助けることができますか?ここで私はこれまで

Option Strict On 
Imports System.Text.RegularExpressions 

Partial Public Class Page 
    Inherits UserControl 

    Public Sub New() 
     InitializeComponent() 
     Dim textbox As New MyTextBox() With {.Width = 300, .Height = 100} 
     LayoutRoot.Children.Add(textbox) 
    End Sub 
End Class 

Public Class MyTextBox 
    Inherits TextBox 
    Protected Overrides Sub OnKeyDown(ByVal e As KeyEventArgs) 
     MyBase.OnKeyDown(e) 
     If e.Key = Key.Back Then 
      e.Handled = True 
      MyBase.OnKeyDown(e) 

     ElseIf e.Key = Key.Delete Then 
      e.Handled = True 
      MyBase.OnKeyDown(e) 
     End If 
    End Sub 
End Class 

おかげ シャノン

+0

これについて私から飛び出す別のことは、同じコードを持つ2つの "if"条件があることです。 "or"を入れてコードを繰り返さないと読みやすくなります(e.Key = Key.Backの場合と同じように).Else e.Key = Key.Delete ...私はそれがあなたのやり方だと思いますそれはVBで) – Rich

+0

あなたはこれを把握しましたか?しかし、おそらく何か..欠けている –

答えて

0

あなたは間違った方法を考えてもよい持っているものです。 Silverlightを使用しているので、バインディング式でこの情報を取得できます。簡単な例のように、テキストボックスにいくつの文字が含まれているかを知りたいとしました。あなたは次のXAMLでこれを達成することができます:あなたはこれを行うにはTextBoxをサブクラス化する必要はありません

<TextBox x:Name="txtInput" /> 
    <TextBlock Text="{Binding ElementName=txtInput, Path=Text.Length}" /> 
+0

私は今、各キーストロークのテキストボックスの長さが必要なので、私はコードの背後にいくつかのロジックを行うことができます。上記のことをどうやってやればいいのか理解できますか?または上記のものがバインドされており、この例ではTextblockに最新の長さが表示されます。ありがとう – jvcoach23

+0

テキスト入力に対応してコードの背後で作業をしたい場合は、KeyUpイベントのイベントハンドラを追加してください。そこでは、TextBoxを名前または送信者によって参照できます。例えば、txtInput.Text.Length。 – Rich

+0

私はテキストボックス上でkeyupイベントを試しました..それは多くのkeyupsのために働く..しかし、バックスペースは無視され...私はそれをキャッチする必要があります。ありがとう – jvcoach23

2

。代わりに、イベントのハンドラをUserControlクラスに追加してください。これが呼び出されると、イベントの送信者はTextBoxになります。あなたはそれからテキストを取得し、あなたがする必要があることを行うことができます。

更新:コメントに基づいて、次のように動作するはずです:

Partial Public Class Page 
    Inherits UserControl 

    Private TextBox1 as TextBox 

    Public Sub New() 
     InitializeComponent() 
     TextBox1 = New TextBox() With {.Width = 300, .Height = 100} 
     LayoutRoot.Children.Add(textbox) 
    End Sub 

    Private Sub OnTextChanged(sender as Object, e as TextChangedEventArgs) Handles TextBox1.TextChanged 
     If e.Key = Key.Back Then 
      e.Handled = True 
     ElseIf e.Key = Key.Delete Then 
      e.Handled = True 
     End If 
    End Sub 
End Class 

(私のVBは少しさびているので、イベントハンドラの構文は完全に正しくない可能性があります。)

基本的な考え方は、UserControl内のTextBoxのテキストが変更されたときに通知を受けることです。この方法で、必要に応じてUserControlの他の部分を変更することができます。

+0

あなたは例を挙げたいと思うでしょう。私はあなたの話しをしようとしましたが、テキストボックスはオーバーライドのように振る舞いませんので、正しく行っていませんでした。 – jvcoach23

+0

私の更新を見てください。それはあなたの質問に答えますか? – Andy

+0

Andy ..大変申し訳ありませんが、私はこれに戻っていません。私は見たことがあります。 OnTextChangedは、私にwithevents変数が必要なエラーを返します。私はtatが通常zamlにあったと思っていた。うまくいけばあなたは私の教育を続けることに興味を持っているだろう。ありがとう – jvcoach23