Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

WPF invoke a control

Tags:

c#

wpf

invoke

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?

like image 739
Yustme Avatar asked Oct 25 '10 16:10

Yustme


People also ask

What does Dispatcher invoke?

Invoke method takes an Action or Delegate and execute the method synchronously. That means it does not return until the Dispatcher complete the execution of the method.

What is Dispatcher c#?

The Dispatcher maintains a prioritized queue of work items for a specific thread. When a Dispatcher is created on a thread, it becomes the only Dispatcher that can be associated with the thread, even if the Dispatcher is shut down.

Is dispatcher invoke synchronous?

Invoke is synchronous and BeginInvoke is asynchronous. The operation is added to the event queue of the Dispatcher at the specified DispatcherPriority. If BeginInvoke is called on a Dispatcher that has shut down, the status property of the returned DispatcherOperation is set to Aborted.


1 Answers

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);
like image 198
Reed Copsey Avatar answered Sep 24 '22 19:09

Reed Copsey