2009-09-03 21 views
10

Así que, básicamente, tengo un montón de cuadros de texto que el usuario puede completar. Tengo un botón que quiero mantener inhabilitado hasta que todos los cuadros de texto hayan ingresado texto en ellos. Aquí es un cuadro de texto XAML muestra que estoy usando:WPF: Cuadro de texto que no activa el eventoTextInput

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

Y aquí está la función que estoy tratando de desencadenar:

//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"); 
    } 

El cuadro de mensaje no aparece cuando debería estar recibiendo TextInput desencadenado Como experimento intenté activar CheckTextBoxFilled() en PreviewTextInput, y funcionó bien entonces, lo que significa que por cualquier razón, la función simplemente no recibe ninguna llamada. También tengo una función de validación que se activa con PreviewTextInput, que funciona como debería. Al principio, pensé que PreviewTextInput podría estar interfiriendo de alguna manera con TextInput, así que saqué PreviewTextInput del TextBox, pero eso no ha logrado arreglar nada. Estoy completamente confundido por qué esto podría pasar, por lo que cualquier ayuda sería apreciada.

+0

¿Qué pasó con los delegados de multidifusión? ¿Por qué no dispararía el evento asignado por el usuario además del propio? –

Respuesta

11

Su controlador para el evento TextInput no se activa porque el TextBox está manejando el evento. Podría intentar usar el evento TextChanged en su lugar, ya que realmente solo quiere saber cuándo se agregaron o eliminaron los caracteres del TextBox.

+2

No lo sabía, gracias. Me imaginé que, dado que PreviewTextInput funcionaba de esa manera, no había nada que impidiera que TextInput funcionara de la misma manera. TextChanged funciona bien. –

+1

A WPF realmente le gusta hacer que lo que debería ser simplemente tareas sea demasiado difícil. Quiero decir, ¿por qué exponer un evento si nunca se disparará? Ridículo ... sí, estoy de acuerdo: D –

+0

@Ed FWIW, si subclases TextBox, entonces podrías manejar el evento. Pero sí veo tu punto. – Andy

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

esto no captura un espacio. el evento no está activado. – Mike

0

Crea una nueva clase derivada de TextBox. En la nueva clase, prevalece el método OnTextInput. Se llamará a su método OnTextInput antes de que TextBox lo obtenga.

0

Use "PreviewTextInput" en su lugar, funcionará.

Cuestiones relacionadas