2014-01-09 2 views
0

MTAThread에 Windows Form 내부에서 호스팅해야하는 WPF 사용자 정의 컨트롤이 있습니다. 그리고 솔루션은 STAThread와 MTAThread 모두에서 작동해야합니다. 그리고 기술적으로는 프로덕션 환경에서 Apartment State를 변경할 수있는 옵션이 없습니다. 이 카운트는 증가하고 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()); 
} 

는 이제 호스트 제어에 부가된다. 그러나 WPF 사용자 컨트롤은 렌더링되지 않습니다. 그러나 STAThread에서 "호출하는 스레드가이 개체에 액세스 할 수 없습니다."예외가 발생합니다. "

이 Anyhelp는 크게 감사하겠습니다.

답변

0

잘 모르겠지만 대부분은 ElementHost Windows-Forms 컨트롤은 COM/ActiveX-Object를 둘러싼 래퍼입니다.

COM/ActiveX UI 컨트롤은 스레드로부터 안전하지 않으므로 STA appartment에서 실행해야합니다. 매우 잘 제기 된 설명은 here입니다.

내 생각에, 당신은 진짜 선택의 여지가 없으므로 진입 스레드를 STA로 변경해야한다고 생각합니다.

+0

빠른 응답을 보내 주셔서 감사합니다. 그러나이 COM 구성 요소가 호스트 시스템에 의해 대리 프로세스로 호출되므로 STAThread로 변경하는 것은 불가능합니다. 그러나, 내 코드를 편집하고 이제는 elementhost가 폼 컨트롤에 추가되었지만 렌더링되지 않습니다 ... – Saqwes

관련 문제