C# System.InvalidOperationException:&x27;调用线程无法访问此对象,因为其他线程拥有它;

C# System.InvalidOperationException:&x27;调用线程无法访问此对象,因为其他线程拥有它;,c#,wpf,xaml,C#,Wpf,Xaml,如何在单独的线程中创建UserControl(任何图形组件),然后将其线程化到主线程。是的,尺子工作,它回到主线程。但似乎不可能在主线程之外的单独线程中生成UserControl public partial class LifePattern : UserControl { Thread t; public LifePattern() { InitializeComponent();

如何在单独的线程中创建UserControl(任何图形组件),然后将其线程化到主线程。是的,尺子工作,它回到主线程。但似乎不可能在主线程之外的单独线程中生成UserControl

   public partial class LifePattern : UserControl
    {
        Thread t;
        public LifePattern()
        {
            InitializeComponent();
            t = new Thread(CreateUiElemet);
            t.IsBackground = true;
            t.SetApartmentState(ApartmentState.STA);
            t.Name = "Thread Create Control";
            t.Start();
        }

        private void CreateUiElemet(object obj)
        {
            // Create in this Thread the Control
            UserControl userControl = new UserControl();

            // Back to the thread Main
            Application.Current.Dispatcher.Invoke(() =>
            {
                btn_Play.Content = userControl;
                //System.InvalidOperationException:
                //'The calling thread cannot access this object because a different thread owns it.'
            });
        }
    }

不要在外部线程中创建此UI控件。在UI线程上创建它。最好的办法是优化CreatesVCControl的工作方式。

我特意在单独的线程中创建CreatesVCControl。因为该过程需要很长时间。控件绑定到您创建它的线程。是的,用户控件是在第二个线程中创建的。UserControls不是线程安全的,您只能从一个线程中触摸它们。不能在一个线程上创建它们,而在另一个线程中使用它们。我知道您想要实现什么,但这在纯WinForms或WPF中是不可能的。您只能使用低级Win32 API混合和匹配属于不同进程或线程的hwnd。也就是说,无法在一个线程中创建UI字符串并将其移动到另一个线程?this.Dispatcher.Invoke(()=>{…//此处的代码。});这仍然不能解决问题,因为在第二个线程中创建的UserControl没有成功地移动到主线程
new CreatesVCControl();