tags:

views:

25

answers:

2

Hi,

How can i invoke a control with parameters? I've googled this up, but no where 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 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?

+4  A: 

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
Ok, i fixed that, that was my first question. But how do i read the content of a textbox?
Yustme
Typically, you'd read it before calling the work function in the separate thread...
Reed Copsey
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
@Yustme: Technically, it could be a problem in Windows Forms, as well... What version of C#/VS are you using?
Reed Copsey
2010 ultimate, 4.0
Yustme
@Yustme: I just showed you how you can read from the UI thread...
Reed Copsey
okay thanks. think i need to do an extreme make over in the code. still not working.
Yustme
@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
A: 

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.

James J. Regan IV