ElementHost在MTAThread中不起作用

时间:2014-01-09 12:55:01

标签: wpf elementhost mta

我有WPF用户控件,需要在 MTAThread 中的Windows窗体中托管。并且解决方案应该与STAThread和MTAThread一起使用。从技术上讲,没有选择改变生产环境中的公寓状态。

Program.cs的

[MTAThread]
static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new Form1());
}  

void Form1_Load(object sender, EventArgs e)
{
    Thread t = new Thread(() =>{
    host = new ElementHost();
    host.Dock = DockStyle.Fill;
    uc = new UserControl1();
    host.Child = uc;
    });
            t.SetApartmentState(ApartmentState.STA);
            t.Start();
            t.Join();
            MessageBox.Show(this.Controls.Count.ToString());
            //if (this.InvokeRequired)
            //{
            //    this.Invoke((Action)(() => { this.Controls.Add(host); }));
            //}
            //else
            {
                this.Controls.Add(host);
            }
            MessageBox.Show(this.Controls.Count.ToString());
}

在这种情况下,现在主机被添加到控件中,因为计数增加并且它不会在MTAThread中抛出任何异常。但WPF用户控件不呈现。但是,在STAThread中它抛出异常“调用线程无法访问此对象....”

非常感谢Anyhelp。

1 个答案:

答案 0 :(得分:0)

我不完全确定,但很可能ElementHost Windows-Forms控件是COM / ActiveX-Object的包装器。

由于COM / ActiveX UI控件本身不是线程安全的,因此它们必须在STA公寓中运行。可以找到一个非常好的解释here

所以我认为,你没有真正的选择,必须将你的入口线程改为STA。