6

I realized a WPF Control Library to use as an Addin in MS Office 2007.

The WPF-Class is instantiated by the host and creates a toolbar with some buttons in MS Office. By clicking a button the WPF window should appear. The problem is that I always receive the following error: "The calling thread must be STA, because many UI components require this." My main function is marked as [STAThread].

It seems that the button_Click event runs in an other thread than the UI thread.

I tried to use a dispatcher, but that didn't work.

Dispatcher.CurrentDispatcher.Invoke(
               System.Windows.Threading.DispatcherPriority.Normal,
               new Action(
                 delegate()
                 {
    wpfform wf = new wpfform();
    wf.ShowDialog();
     ));

I think the module gets a wrong dispatcher, but I don't know exactly. Next I tried to start the window in an separate STA thread and join the thread, but this didn't work either. As I removed the [STAThread] Attribute from the main function the window started, but i was unable to access office (because i'm in a separate thread).

Thread workerThread = new Thread(_ShowDialog);
workerThread.SetApartmentState(ApartmentState.STA);
workerThread.Start();
workerThread.Join();

Is it possible to determine the UI thread and create a dispatcher for this thread, or how can I come back to the UI thread?

GEOCHET
  • 21,119
  • 15
  • 74
  • 98
MarkusEm
  • 69
  • 1
  • 1
  • 3

2 Answers2

9

You will need to use the application UI dispatcher. Try using:

Application.Current.Dispatcher.Invoke(...)
DEHAAS
  • 1,294
  • 11
  • 17
1

You can use SynchronizationContext, which is described here in stackoverflow: Using SynchronizationContext for sending events back to the UI for WinForms or WPF (you have to "capture" context on UI thread, sadly, result of that question is: you should use Application.Current.Dispatcher -- maybe you should look why is null)

Community
  • 1
  • 1
Jan 'splite' K.
  • 1,667
  • 2
  • 27
  • 34