2011-12-16 7 views
7

Bene, sto scrivendo un file di estensioni/metodo utile per stringhe, etichette, linklabels, classe ecc.come utilizzare il metodo Invoke in un file di estensioni/metodi?

ma, ho un problema. Ho un metodo showMessage() che cambia il testo dell'etichetta, funziona perfettamente. Ma decido di fare che funziona con l'esecuzione filo, allora faccio questo:

namespace LabelExtensions 
{ 
    public static class LabelExtensionsClass 
    {   
     private delegate void UpdateState(); 

     public static void ShowMessage(this Label label, string text) 
     { 
      if (label.InvokeRequired) 
      { 
       label.Invoke((UpdateState)delegate 
       { 
        label.Text = text; 
       }); 
      } 
      else 
      { 
        label.Text = text; 
      } 
     } 
} 
} 

dispiace, è stato un errore di battitura. Ho digitato questo codice sul forum. l'errore continua.

secondo il documentation, di utilizzare il metodo Invoke necessità alle importazioni:

Namespace: System.Windows.Forms

Assemblea: System.Windows.Forms (in System.Windows.Forms .dll)

poi ho fatto:

using System.Windows.Forms; 

ma restituisce lo stesso errore:

The name 'Invoke' does not exist in the current context 

come risolvere questo problema?

Grazie in anticipo.

+0

È possibile utilizzare il delegato 'Azione' esistente; non è necessario crearne di propri. – SLaks

+0

Forse, '(label.TopLevelControl as Form) .Invoke' – Joe

+0

@SLaks: Grazie :) –

risposta

8

Perché non basta fare questo:

label.BeginInvoke((Action) (() => label.Text = text)); 

v'è alcuna necessità di creare il proprio delegato. Basta usare il delegato integrato Action. Probabilmente dovresti creare il tuo metodo di estensione per la classe base Control invece della classe Label. Sarà più riutilizzabile.

1

Hai dimenticato di specificare l'etichetta nel codice (quando si chiama il metodo Invoke):

public static void ShowMessage(this Label label, string text) 
     { 
      if (label.InvokeRequired) 
      { 
       lablel.Invoke((UpdateState)delegate 
       { 
        label.Text = text; 
       }); 
      } 
      else 
      { 
        label.Text = text; 
      } 
     } 

anche, considerare l'utilizzo di BeginInvoke invece in modo da non bloccare il thread chiamante (se applicabile)

3

Change

Invoke((UpdateState)delegate … 

a

label.Invoke((UpdateState)delegate … 
+0

Esattamente. Il metodo "Invoke" di cui hai bisogno è un membro della classe System.Windows.Forms.Control, da cui deriva l'etichetta. La tua classe LabelExtensions statica non ha un metodo "Invoke". – KeithS

+0

scusate, era un errore di battitura. :( –

1

Invoke è un metodo di istanza di Control.
È necessario un Control per richiamarlo, ad esempio label.

+0

scusate, era un errore di battitura. :( –

+0

@ TheMask: Funziona? – SLaks

1

Non è necessario dichiarare un nuovo tipo di delegato o costruire un nuovo lambda o un delegato anonimo. Hai già un metodo che agisce sul thread dell'interfaccia utente - quello che stai scrivendo. Basta chiamarlo sul thread dell'interfaccia utente, se necessario, in questo modo.

public static void ShowMessage(this Label label, string text) { 

    if(label.InvokeRequired) { 
     label.Invoke(new Action<Label, string>(ShowMessage), label, text); 
     return; 
    } 

    label.Text = text; 
} 

Il vantaggio di questo approccio è che si può quasi copiare e incollare il blocco di codice di reindirizzamento da questo metodo per qualsiasi altro metodo che si desidera modificare nello stesso modo.