How do I open a window on a new thread?
You need to call Show()
on the same thread that the window is created on - that's why you are getting the error. Then you also need to start a new Dispatcher instance to get the runtime to manage the window.
private void launchViewerThread_Click(object sender, RoutedEventArgs e){ Thread viewerThread = new Thread(delegate() { viewer = new SkeletalViewer.MainWindow(); viewer.Show(); System.Windows.Threading.Dispatcher.Run(); }); viewerThread.SetApartmentState(ApartmentState.STA); // needs to be STA or throws exception viewerThread.Start();}
See the Multiple Windows/Multiple Threads example at: http://msdn.microsoft.com/en-us/library/ms741870.aspx
So I was running into a similar issue where a new window failed to open on a new thread. The exception was "cannot use a dependencyobject that belongs to a different thread".
The issue ended up being that the window was using a global resource (Background brush). Once I froze the brush resource, the window loaded just fine.
I am not sure if this will solve your problem but can you try creating a thread proc (to open a viewer window) which is executed on a different thread and then have a dispatcher.beginInvoke to update the main window ,
Here is some code-
in the constructor register this public MainWindow() { UpdateColorDelegate += UpdateColorMethod; } // delegate and event to update color on mainwindow public delegate void UpdateColorDelegate(string colorname); public event UpdateColorDelegate updateMainWindow; // launches a thread to show viewer private void launchViewerThread_Click(object sender, RoutedEventArgs e) { Thread t = new Thread(this.ThreadProc); t.Start(); } // thread proc public void ThreadProc() { // code for viewer window ... // if you want to access any main window elements then just call DispatchToMainThread method DispatchToUiThread(color); } // private void DispatchToUiThread(string color) { if (updateMainWindow != null) { object[] param = new object[1] { color}; Dispatcher.BeginInvoke(updateMainWindow, param); } } // update the mainwindow control's from this method private void UpdateColorMethod(string colorName) { // change control or do whatever with main window controls }
With this you can update the main window controls without freezing it, Let me know if you have any questions