How do I open a window on a new thread?

后端 未结 3 807
离开以前
离开以前 2021-02-08 12:48

I have a options window and a window that displays color based on these options and Kinect data. So far everything\'s on one thread (as far as I know; I haven\'t done any thread

相关标签:
3条回答
  • 2021-02-08 13:15

    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

    0 讨论(0)
  • 2021-02-08 13:24

    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.

    0 讨论(0)
  • 2021-02-08 13:27

    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

    0 讨论(0)
提交回复
热议问题