2016-10-06 3 views
0

"호출 스레드 ..."에 대한 많은 의문점이 있습니다. 그러나 시도한 방식으로 문제를 해결하지 못했고, 스레드 호출을 포함 시키지만 어디에 있는지 모르겠습니다.새 창이 열림 "호출 스레드는 STA 여야합니다."

mailItem을 만들고 메일 항목이 닫힌 경우 아래와 같이 보내기 및 닫기 이벤트 처리기를 추가합니다. 메일 항목이 전송되면 아무 것도하지 않습니다. 사용자에게 일종의 등록을 위해 창을 열어야합니다. 역사.

기록을 등록 할 창을 만들려고하면 오류가 발생합니다.

단계 1 :

((Microsoft.Office.Interop.Outlook.ItemEvents_10_Event)mailItem).Send += new Microsoft.Office.Interop.Outlook.ItemEvents_10_SendEventHandler(EmailEnviado); 

((Microsoft.Office.Interop.Outlook.ItemEvents_10_Event)mailItem).Close += new Microsoft.Office.Interop.Outlook.ItemEvents_10_CloseEventHandler(EmailCancelado); 

2 단계

mailItem.Display(); 

단계 미리 3

private void EmailEnviado(ref bool 
{ 
      List<int> listaPendenciaId = new List<int>(); 

      foreach (Pendencia pendencia in this.listaPendencia) 
      { 
       if (pendencia.IsSelecionado) 
       { 
        listaPendenciaId.Add(pendencia. 
      System.Windows.Window historicoEmailCadastro = new System.Windows.Window 
        { 
         Title = "Cadastro de Histórico de Email", 
         Content = new HistoricoEmailCadastro(listaPendenciaId), 
         Width = 249, 
         Height = 213, 
         ResizeMode = ResizeMode.NoResize 
        }; 

      historicoEmailCadastro.ShowDialog(); 
} 

감사합니다.

+0

마이크로 소프트 오피스 API를 COM 기반을하고 COM 개체가 생성 된 동일한 스레드에서 접근 할 필요가있다. –

+0

흠, Outlook의 Application 개체를 초기화하는 방식에 문제가 있습니다. 작업 스레드에서 생성하는 것과 같습니다. 우리는 그 코드를 볼 수는 없지만 그것을 고쳐야합니다. –

답변

2

UI 스레드에서만 모든 UI 항목을 호출해야합니다.

Application.Current.Dispatcher.Invoke(() => 
{  
    ///.... 
     System.Windows.Window historicoEmailCadastro = new System.Windows.Window 
     { 
      Title = "Cadastro de Histórico de Email", 
      Content = new HistoricoEmailCadastro(listaPendenciaId), 
      Width = 249, 
      Height = 213, 
      ResizeMode = ResizeMode.NoResize 
     }; 

    historicoEmailCadastro.ShowDialog(); 
}); 

더 많은 정보 here

+0

대단히 감사합니다! – User

관련 문제