2014-01-09 2 views
0

У меня есть пользовательский элемент управления WPF, который должен размещаться внутри Windows Form в MTAThread. Решение должно работать как с STAThread, так и с MTAThread. И технически нет возможности изменить состояние квартиры в производственной среде.ElementHost не работает в 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 User Control не выполняет рендеринг. Тем не менее, в STAThread он выбрасывает исключение «Calling Thread не может получить доступ к этому объекту ....»

Anyhelp в этом было бы весьма полезно.

ответ

0

Я не совсем уверен, но, скорее всего, управление Windows-Forms ElementHost является оберткой вокруг объекта COM/ActiveX.

И поскольку элементы управления COM/ActiveX UI сами по себе не являются потокобезопасными, они должны запускаться в квартире STA. Очень хорошее позитивное объяснение можно найти here.

Так что, я думаю, у вас нет реального выбора и вам нужно изменить свою входную нить в STA.

+0

Благодарим за быстрый ответ. Тем не менее, переход на STAThread может оказаться невозможным, поскольку этот COM-компонент вызывается суррогатным процессом хост-системой. Тем не менее, я отредактировал свой код, и теперь elementhost добавлен в элемент управления формами, но это не рендеринг ... – Saqwes

Смежные вопросы