2010-10-25 14 views
8

¿Cómo puedo invocar un control con parámetros? Lo busqué en Google, ¡pero no dónde encontrarlo!WPF invocar un control

invoke ui thread

Este es el error que consigo:

Información adicional: Parámetro recuento desajuste.

Y esto sucede cuando hago una simple comprobación de si la propiedad de texto de un control de cuadro de texto está vacía o no. Esto funciona en WinForms:

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

Salta desde esta línea If al bloque catch y me muestra ese mensaje.

Ésta es la forma en que trato de invocar el control:

// el delegado: delegado privada vacío TBXTextChanger (cadena de texto);

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

¿Qué estoy haciendo mal? ¿Y desde cuándo tengo que invocar un control cuando solo quiero leer su contenido?

Respuesta

15

Cuando llama a Invoke, no especifica su argumento (text). Cuando Dispatcher intenta ejecutar su método, no tiene un parámetro que suministrar, y usted obtiene una excepción.

Probar:

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

Si desea leer el valor de un cuadro de texto, una opción es utilizar 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, lo arreglé, esa fue mi primera pregunta. ¿Pero cómo leo el contenido de un cuadro de texto? – Yustme

+0

Normalmente, lo leería antes de llamar a la función de trabajo en el hilo separado ... –

+0

Pero tengo que leerlo constantemente. no solo antes de eso el hilo de trabajo es un hilo sin fin, que solo se detiene cuando se cierra el programa. esta aplicación funciona bien en WinForm, migrando a WPF – Yustme

0

Reed es correcta, pero la razón lo que necesita hacer es que los elementos de la GUI no son seguros para subprocesos y, por lo tanto, todas las operaciones de la GUI deben realizarse en la secuencia de la GUI para garantizar que el contenido se lea correctamente. Es menos obvio por qué esto es necesario con una operación de lectura como esta, pero es muy necesario con las escrituras, por lo que el framework .NET solo requiere que todo el acceso a la GUI se realice en el hilo de la GUI.