2011-12-16 7 views
7

Bueno, estoy escribiendo un archivo de extensiones/método útil para cadenas, etiquetas, etiquetas de enlace, clase, etc.cómo usar el método Invoke en un archivo de extensiones/métodos?

pero, tengo un problema. Tengo un método showMessage() que cambia el texto de la etiqueta, funciona bien. Pero decido hacer que trabaja con la ejecución del hilo, a continuación, hago esto:

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; 
      } 
     } 
} 
} 

siento, fue un error tipográfico. Escribí este código en el foro. el error continúa.

según la documentation, utilizar el método Invoke necesidad de importaciones:

Espacio de nombres: System.Windows.Forms

Asamblea: System.Windows.Forms (en System.Windows.Forms .dll)

luego hice:

using System.Windows.Forms; 

pero esto devuelve el mismo error:

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

cómo lo soluciono?

Gracias de antemano.

+0

Puede usar el delegado 'Action' existente; no es necesario que crees el tuyo. – SLaks

+0

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

+0

@SLaks: Thanks :) –

Respuesta

8

¿Por qué no hacer esto:

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

No hay necesidad de crear su propio delegado. Solo use el delegado incorporado Action. Probablemente deberías crear tu método de extensión para la clase base Control en lugar de la clase Label. Será más reutilizable.

1

que se olvidó de especificar la etiqueta en su código (cuando se llama al método Invoke):

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

también, considerar el uso de BeginInvoke lugar para que no se bloquee el subproceso de llamada (si es aplicable)

3

Cambio

Invoke((UpdateState)delegate … 

a

label.Invoke((UpdateState)delegate … 
+0

Exactamente. El método "Invoke" que necesita es miembro de la clase System.Windows.Forms.Control, de la cual se deriva Label. Su clase estática de LabelExtensions no tiene un método de "Invocación". – KeithS

+0

lo siento, fue un error tipográfico. :( –

1

Invoke es un método de instancia de Control.
Necesita un Control para llamarlo, como su label.

+0

lo siento, fue un error tipográfico :( –

+0

@TheMask: ¿Está funcionando? – SLaks

1

No necesita declarar un nuevo tipo de delegado, ni construir un nuevo delegado lambda o anónimo. Ya tiene un método que actúa sobre el hilo de UI, el que está escribiendo. Simplemente haga que se llame a sí mismo en el hilo de la IU si es necesario, así.

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; 
} 

La ventaja de este enfoque es que casi se puede copiar y pegar el bloque de código de redirección de este método para cualquier otro método que desea modificar de la misma manera.

Cuestiones relacionadas