2011-09-16 11 views
10

Prima di tutto questo è la voce di log degli errori sul mio erroreDispatcher getta InvalidOperationException su Messagebox.Show in evento TextChanged

crash program @ 15-9-2011 15:01:30error:System.InvalidOperationException: Dispatcher processing has been suspended, but messages are still being processed. at System.Windows.Threading.Dispatcher.WndProcHook(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)

codice Comunque:

private void TB_postcode_cijfers_TextChanged(object sender, TextChangedEventArgs e){ 
if (TB_postcode_cijfers.Text != string.Empty || TB_postcode_cijfers.Text.Length > 0) 
{ 
    LBL_postcode.Content = Postcode_cijfers + Postcode_letters; 
    if (TB_postcode_cijfers.Text.Length == 4 && TB_postcode_letters.Text.Length == 2) 
    { 
     if (!ZoekOpPostcode(Injectioncheck(TB_postcode_cijfers.Text + TB_postcode_letters.Text))) 
     { 
      //MessageBox.Show("Geen resultaat gevonden, " + errortext); 
      if (MessageBox.Show("Geen resultaat gevonden, " + errortext + ".\n Wilt u overschakelen naar handmatig? ", "Handmatig?", MessageBoxButton.YesNo) == MessageBoxResult.Yes) 
      { 
       RB_handmatig.IsChecked = true; 
      } 
      else 
      { 
       // 
      } 
     } 
    } 
}} 

Così sul metodo messagebox.show . questo accade solo quando l'utente cambia modalità di lettura in modalità modifica sul mio modulo. questo implica il collasso en mostrando alcune etichette e controlli ui.

se l'evento si attiva da utenteinput tutto va bene. Cosa voglio sapere: Perché l'evento textchanged si attiva nascondendo e mostrando alcuni controlli. Cosa posso fare per prevenire questo errore?

MODIFICA: il codice sopra è in un controllo wpf personalizzato. collocato in una WinForms progetto/modulo

+0

fa il codice MessageBox corsa sul thread UI? – thumbmunkeys

+0

Non sono sicuro, per quanto posso dire, perché è un evento da un controllo ui dovrebbe essere ?? destra?? – Daanvl

+0

È possibile fornire la finestra del proprietario in MessageBox.Show()? Ha una firma sovraccaricata che accetta il proprietario della finestra. –

risposta

21

Vai a questa thread descrive lo stesso problema come la tua:

L'eccezione è fatto apposta per evitare i bug reentrancy causati da stranezza derivante da alterare la struttura ad albero visuale, mentre tale evento (che a sua volta è stato innescato dall'alterazione della struttura visiva) è lo sparo . Se davvero devi confermare qualcosa quando cambia lo stato di un elemento dell'interfaccia utente, il ritardo con Dispatcher.BeginInvoke è probabilmente la cosa giusta da fare.

per eseguire codice sul thread UI effettuare le seguenti operazioni:

Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Normal, (Action)(() => 
    { 

     if (MessageBox.Show("Geen resultaat gevonden, " + errortext + ".\n Wilt u overschakelen naar handmatig? ", "Handmatig?", MessageBoxButton.YesNo) == MessageBoxResult.Yes) 
     { 
      RB_handmatig.IsChecked = true; 
     } 
     else 
     { 
      // 
     } 
    })); 
+0

Non so molto su lambda ma questo mi dà errore Impossibile convertire l'espressione lambda per digitare 'System.Delegate' perché non è un tipo delegato – Daanvl

+0

Ho modificato la risposta – thumbmunkeys

+0

Che ora costruisce, ma dà NullReferenceException sulla prima riga. Sto iniziando a sospettare che il dispatcher non sia vivo a quel punto? – Daanvl

Problemi correlati