2014-05-04 14 views
14

Ho un progetto WPF, quando provo a fare funzionare questo codice su RowLoad evento ho ottenuto qui di seguito Errore:WPF: elaborazione Dispatcher è stato sospeso, ma i messaggi sono ancora in fase di elaborazione

private void ParentGridView_OnRowLoaded(object sender, EventArgs e) 
{ 
    try 
    { 
     if(((RadGridView)sender).Columns != null) 
     { 
      MessageBox.Show(((RadGridView)sender).Columns.Count.ToString(CultureInfo.InvariantCulture)); 
     } 
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(ex.Message); 
    } 
} 

errore: l'elaborazione Dispatcher ha stato sospeso, ma i messaggi sono ancora in fase di elaborazione.

noti che il controllo GridView è Telerik RadGridView

risposta

21

This answer descrive la stessa situazione come la tua. (Fa riferimento a questo answer on a different website).

L'elaborazione del dispatcher viene sospesa per evitare problemi di rientranza durante l'aggiornamento dell'albero visivo.

Se è davvero necessario visualizzare una finestra di messaggio in risposta all'evento "Row Loaded", è necessario rinviare la chiamata utilizzando `Dispatcher.BeginInvoke().

Quindi, sostituire:

MessageBox.Show(((RadGridView)sender).Columns.Count.ToString(CultureInfo.InvariantCulture)); 

con:

var msg = ((RadGridView)sender).Columns.Count.ToString(CultureInfo.InvariantCulture); 
Dispatcher.BeginInvoke(new Action(() => MessageBox.Show(msg))); 

Se questo codice è in un oggetto WPF, quindi la proprietà Dispatcher è disponibile. Altrimenti, devi ottenerlo da qualche altra parte.