2016-10-06 1 views
0

Ich weiß, dass es viele Fragen zu "The calling thread ..." gibt, aber die Art, wie ich versucht habe, hat mein Problem nicht gelöst und ich weiß, dass ich es tun muss einen Thread-Aufruf ein, aber ich weiß nicht wo.Neues Fenster öffnen "Der aufrufende Thread muss STA sein"

Also, ich erstelle ein mailItem und fügen Sie die send und schließen Ereignishandler wie folgt, wenn das Mail-Element geschlossen ist Ich mache nichts, wenn das Mail-Element gesendet wird, muss ich ein Fenster für den Benutzer öffnen, um eine Art von registrieren Geschichte.

Der Fehler tritt auf, wenn ich versuche, das Fenster zum Registrieren des Verlaufs zu erstellen.

Schritt 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); 

Schritt 2

mailItem.Display(); 

Schritt 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(); 
} 

Dank im Voraus.

+0

Microsoft Office APIs sind COM-basierte und COM-Objekte müssen im selben Thread zugegriffen werden sie erstellt wurden. –

+0

Hmm, etwas stimmt nicht mit der Art, wie Sie das Application-Objekt von Outlook initialisieren. So wie es in einem Worker-Thread erstellt wird. Wir können diesen Code nicht sehen, aber Sie sollten ihn beheben. –

Antwort

2

Sie sollten alle UI-Sachen nur vom UI-Thread aufrufen.

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(); 
}); 

Mehr Infos here

+0

Vielen Dank Tym! – User

Verwandte Themen