2010-10-25 12 views
8

Come posso richiamare un controllo con parametri? Ho cercato su google, ma non dove trovarlo!WPF richiama un controllo

invoke ui thread

Questo è l'errore che ottengo:

Ulteriori informazioni: Parametro conteggio mancata corrispondenza.

E ciò accade quando faccio un semplice controllo se la proprietà text di un controllo textbox è vuota o meno. Questo funziona in WinForms:

if (this.textboxlink.Text == string.Empty) 
    SleepThreadThatIsntNavigating(5000); 

Salta da questo se linea al blocco catch e mi mostra quel messaggio.

Questo è il modo cerco di richiamare il controllo:

// il delegato: delegato private void TBXTextChanger (stringa di testo);

private void WriteToTextBox(string text) 
    { 
     if (this.textboxlink.Dispatcher.CheckAccess()) 
     { 
      this.textboxlink.Text = text; 
     } 

     else 
     { 
      this.textboxlink.Dispatcher.Invoke(
       System.Windows.Threading.DispatcherPriority.Normal, 
       new TBXTextChanger(this.WriteToTextBox)); 
     } 
    } 

Cosa sto facendo male? E da quando devo invocare un controllo quando voglio solo leggere il suo contenuto?

risposta

15

Quando si chiama Invoke, non si specifica il proprio argomento (text). Quando il Dispatcher tenta di eseguire il tuo metodo, non ha un parametro da fornire e ottieni un'eccezione.

Prova:

this.textboxlink.Dispatcher.Invoke(
    System.Windows.Threading.DispatcherPriority.Normal, 
    new TBXTextChanger(this.WriteToTextBox), text); 

Se si desidera leggere il valore da una casella di testo, una possibilità è quella di utilizzare un lambda:

string textBoxValue = string.Empty; 

this.textboxlink.Dispatcher.Invoke(DispatcherPriority.Normal, 
    new Action(() => { textBoxValue = this.textboxlink.Text; })); 

if (textBoxValue == string.Empty) 
    Thread.Sleep(5000); 
+0

Ok, ho risolto, quella era la mia prima domanda. Ma come leggo il contenuto di una casella di testo? – Yustme

+0

In genere, dovresti leggerlo prima di chiamare la funzione di lavoro nel thread separato ... –

+0

Ma devo leggerlo costantemente. non solo prima. il thread di lavoro è un thread infinito, che si arresta solo quando il programma si chiude. questa app funziona bene in WinForm, im la migrazione in WPF – Yustme

0

Reed è corretta, ma la ragione è necessario fare questo è che gli elementi della GUI non sono thread-safe e quindi tutte le operazioni della GUI devono essere eseguite sul thread della GUI per assicurare che il contenuto sia letto correttamente. È meno ovvio perché questo è necessario con un'operazione di lettura come questa, ma è molto necessario con le scritture e quindi il framework .NET richiede solo l'accesso alla GUI da fare nel thread della GUI.