2009-09-03 24 views
10

基本的に、私はユーザーが記入するTextBoxesの束を持っています。すべてのTextBoxにテキストが入力されるまで、無効にしたいボタンがあります。ここで私が使用しているサンプルのXAMLのテキストボックスである:WPF:TextBoxがTextInputイベントを発生させない

<TextBox Name="DelayedRecallScore" TextInput="CheckTextBoxFilled" Width="24" /> 

そして、ここでは、私がトリガーしようとしている機能である:

//Disables the OK button until all score textboxes have content 
    private void CheckTextBoxFilled(object sender, RoutedEventArgs e) 
    { 
     /* 
     foreach (TextBox scorebox in TextBoxList) 
     { 
      if (string.IsNullOrEmpty(scorebox.Text)) 
      { 
       Ok_Button.IsEnabled = false; 
       return; 
      } 
     } 
     Ok_Button.IsEnabled = true; 
     */ 
     MessageBox.Show("THIS MAKES NO SENSE"); 
    } 

メッセージボックスはTextInputコントロールを取得しなければならない時に表示されませんトリガーされた。実験として、私はPreviewTextInputでCheckTextBoxFilled()を起動しようとしました。それはうまくいきました。なぜなら、何らかの理由で関数が呼び出されていないからです。また、PreviewTextInputによってトリガされる検証関数があります。これは正常に動作します。最初は、PreviewTextInputが何らかの形でTextInputを妨害している可能性があるので、PreviewTextInputをTextBoxから取り出しましたが、何も修正できませんでした。なぜこのようなことが起こるのか、私は完全に勘違いしているので、どんな助けもありがたいです。

+0

マルチキャストデリゲートはどうなりましたか?それはなぜそれがそれ自身のものに加えてユーザー割り当てのイベントを発射しないでしょうか? –

答えて

11

イベントのハンドラーは、TextBoxがイベントを処理しているため発生しません。あなたはTextChangedイベントを代わりに使用してみることができます。なぜなら、文字がいつTextBoxに追加または削除されたかを知りたいからです。

+2

私はそれを知らなかった、ありがとう。私は、PreviewTextInputがそのように機能して以来、TextInputが同じように機能するのを止めるものはないと考えていました。 TextChangedはうまく動作します。 –

+1

WPFは、単純にタスクが過度に難しいものを作るのが本当に好きです。つまり、決して発砲しない場合、なぜイベントを公開するのですか?ばかばかしい...ええ、私は通気しています:D –

+0

@ FWIW、TextBoxをサブクラス化すると、イベントを処理できます。しかし、私はあなたのポイントを見ます。 – Andy

5
InitializeComponent(); 
textbox.AddHandler(TextBox.TextInputEvent, 
        new TextCompositionEventHandler(TextBox_TextInput_1), 
        true); 
+0

これはスペースをキャプチャしません。イベントは発生しません。 – Mike

0

TextBoxから派生した新しいクラスを作成します。新しいクラスでは、OnTextInputメソッドをオーバーライドします。 OnTextInputメソッドは、TextBoxが取得する前に呼び出されます。

0

"PreviewTextInput"を代わりに使用してください。

関連する問題