2009-09-03 20 views
10

Tak więc, w zasadzie mam kilka pól TextBox, które użytkownik wypełnia. Mam przycisk, który chcę wyłączyć, dopóki wszystkie TextBoxy nie wprowadzą w nich tekstu. Oto przykład XAML tekstowe, które używam:WPF: Pole tekstowe nie uruchamia się na zdarzeniuTextInput

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

I tu jest funkcja, która próbuję wywołać:

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

MessageBox nie pokazuje się, gdy TextInput powinien być coraz rozsierdzony. Jako eksperyment próbowałem wywoływać CheckTextBoxFilled() na PreviewTextInput i działało to dobrze, co oznacza, że ​​z jakiegoś powodu funkcja ta nie jest wywoływana. Mam również funkcję sprawdzania poprawności, która jest uruchamiana przez PreviewTextInput, który działa tak jak powinien. Najpierw myślałem, że funkcja PreviewTextInput może w jakiś sposób zakłócać działanie TextInput, więc wziąłem PreviewTextInput z TextBox, ale to nie udało się naprawić niczego. Jestem całkowicie zdumiony tym, dlaczego tak się stanie, więc każda pomoc będzie doceniona.

+0

co stało się z delegatami multiemisji? dlaczego nie miałby wywołać zdarzenia przypisanego przez użytkownika oprócz własnego? –

Odpowiedz

11

Twój przewodnik dla zdarzenia TextInput nie jest wywoływany, ponieważ TextBox obsługuje zdarzenie. Możesz spróbować użyć zdarzenia TextChanged, ponieważ naprawdę chcesz tylko wiedzieć, kiedy znaki zostały dodane lub usunięte z TextBox.

+2

Nie wiedziałem tego, dzięki. Wyobrażałem sobie, że skoro funkcja PreviewTextInput działała w ten sposób, nie było nic, co mogłoby powstrzymać działanie TextInput w ten sam sposób. TextChanged działa dobrze. –

+1

WPF naprawdę lubi robić to, co powinno być po prostu zbyt trudnymi zadaniami. To znaczy, po co wystawiać wydarzenie, jeśli nigdy nie wystrzeli? Śmieszne ... tak, odpowiem: D –

+0

@Ed FWIW, jeśli masz podklasę TextBox, możesz obsłużyć wydarzenie. Ale widzę twój punkt widzenia. – Andy

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

to nie przechwytuje spacji. wydarzenie nie zostanie wyrzucone. – Mike

0

Utwórz nową klasę pochodną od TextBox. W nowej klasie należy zastąpić metodę OnTextInput. Twoja metoda OnTextInput zostanie wywołana zanim otrzyma ją TextBox.

0

Zamiast tego użyje "PreviewTextInput", to zadziała.

Powiązane problemy