我有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。
答案 0 :(得分:0)
我不完全确定,但很可能ElementHost
Windows-Forms控件是COM / ActiveX-Object的包装器。
由于COM / ActiveX UI控件本身不是线程安全的,因此它们必须在STA公寓中运行。可以找到一个非常好的解释here。
所以我认为,你没有真正的选择,必须将你的入口线程改为STA。