18

How can I invoke a control with parameters? I've googled this up, but nowhere to find!

invoke ui thread

This is the error i get:

Additional information: Parameter count mismatch.

And this happens when i do a simple check whether the text property of a textbox control is empty or not. This works in WinForms:

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

It jumps from this if the line to the catch block and shows me that message.

This is how i try to invoke the control:

// the delegate:
private delegate void TBXTextChanger(string text);

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

What am I doing wrong? And since when do i have to invoke a control when i just want to read its content?

Hille
  • 2,123
  • 22
  • 39
Yustme
  • 6,125
  • 22
  • 75
  • 104

2 Answers2

31

When you call Invoke, you're not specifying your argument (text). When the Dispatcher tries to run your method, it doesn't have a parameter to supply, and you get an exception.

Try:

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

If you want to read the value from a text box, one option is to use a lambda:

string textBoxValue = string.Empty;

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

if (textBoxValue == string.Empty)
    Thread.Sleep(5000);
Reed Copsey
  • 554,122
  • 78
  • 1,158
  • 1,373
  • Ok, i fixed that, that was my first question. But how do i read the content of a textbox? – Yustme Oct 25 '10 at 17:13
  • Typically, you'd read it before calling the work function in the separate thread... – Reed Copsey Oct 25 '10 at 17:14
  • But i have to constantly read it. not just before it. the worker thread is an endless thread, which only stops when the program closes. this app works fine in WinForm, im migrating it to WPF – Yustme Oct 25 '10 at 17:23
  • @Yustme: Technically, it could be a problem in Windows Forms, as well... What version of C#/VS are you using? – Reed Copsey Oct 25 '10 at 17:26
  • okay thanks. think i need to do an extreme make over in the code. still not working. – Yustme Oct 25 '10 at 17:59
  • @Yustme: Better to just have the UI set the string, and poll on a string in a field/property. That way, you're not touching the control directly from your background thread... – Reed Copsey Oct 25 '10 at 18:01
  • http://blog.somecreativity.com/2008/01/10/wpf-equivalent-of-invokerequired/ might be of help as well – Boern Sep 02 '14 at 11:15
0

Reed is correct, but the reason you need to do this is that GUI elements are not thread safe and so all GUI operations have to be done on the GUI thread to ensure that the content is being read correctly. Its less obvious why this is necessary with a read operation like this but it is very necessary with writes and so the .NET framework just requires all access to the GUI to be done in the GUI thread.

Arrya Regan
  • 1,104
  • 8
  • 22