2011-10-18 10 views
8

Sto lavorando con WPF e sto cercando di creare una casella di testo drag'n'drop.
In questa casella di testo voglio ottenere il corpo di una e-mail che trascino da Outlook.
Il codice funziona ma penso di aver bisogno di qualcosa per "resettare" la causa ActiveExplorer ora mostra solo l'ultima email "NEW" che trascino nella casella di testo.Ottieni corpo dall'email di Outlook [Drag'n'Drop]

Esempio:

drag-mail 1 -> Casella di testo - Spettacoli e-mail 1

drag-mail 2 -> Casella di testo - Spettacoli e-mail 2

drag-mail 1 -> Casella di testo - Spettacoli l'e-mail 2 e l'e-mail 1 non verranno visualizzati perché sono già presenti in ActiveExplorer e mostreranno l'e-mail 2.


Spero che la mia domanda sia un po 'chiara per te ..
Grazie in anticipo!

codice XAML:

<TextBox 
    Name="myTextbox" 
    AllowDrop="True" 
    PreviewDragEnter="email_DragEnter" 
    PreviewDrop="email_Drop" /> 

codice XAML dietro:

private void email_DragEnter(object sender, DragEventArgs e) 
    { 
     e.Effect = DragDropEffects.Copy; 
    } 

    private void email_Drop(object sender, DragEventArgs e) 
    { 
     Outlook.ApplicationClass oApp = new Outlook.ApplicationClass(); 
     Outlook.Explorer oExplorer = oApp.ActiveExplorer(); 
     Outlook.Selection oSelection = oExplorer.Selection; 

     foreach (object item in oSelection) 
     { 
      Outlook.MailItem mi = (Outlook.MailItem)item; 
      myTextbox.Text = mi.Body.ToString(); 
     } 
    } 

risposta

9

Ho spostato la dichiarazione di oApp dall'evento DragDrop come di seguito e funziona come previsto.

void Startup() 
{ 
    _Outlook = new Outlook.Application(); 
} 

Outlook.Application _Outlook = null; 

private void Form1_DragEnter(object sender, DragEventArgs e) 
{ 
    e.Effect = DragDropEffects.Copy; 
} 

private void Form1_DragDrop(object sender, DragEventArgs e) 
{ 
    richTextBox1.Text = ""; 
    Outlook.Explorer oExplorer = _Outlook.ActiveExplorer(); 
    Outlook.Selection oSelection = oExplorer.Selection; 

    foreach (object item in oSelection) 
    { 
     Outlook.MailItem mi = (Outlook.MailItem)item; 
     richTextBox1.AppendText(mi.Body.ToString() + "\n----------------------------------------\n"); 
    } 
} 

-------- -------- EDIT

o è possibile che si visualizzano solo l'ultimo elemento a causa di questo ciclo?

foreach (object item in oSelection) 
{ 
    Outlook.MailItem mi = (Outlook.MailItem)item; 
    myTextbox.Text = mi.Body.ToString(); //<--- Only last items text 
} 
+0

Questo funziona bene , ma qual è il modo di riavere 1 email? Quindi solo l'ultima mail che hai trascinato? – jefsmi

+0

Siamo spiacenti, non sono sicuro di aver capito correttamente ma se trascino un elemento, vedo solo il suo testo. Se seleziono più, tutto il loro testo arriva a richtextbox1 –

+0

E trascina in questo ordine: Posta 1 -> dopo quella casella di testo libera e trascina un Altro messaggio -> dopo quella casella di testo libera e trascina nuovamente Mail 1 di quello che mostra la seconda posta trascinata e non Mail 1 – jefsmi

0

Utilizzando la versione 14.0.0.0 del Microsoft.Office.Interop.Outlook.dll non posso usare l'oggetto Outlook.ApplicationClass.

Invece ho usato il Outlook.Application nell'esempio che hai dato e funziona come un fascino (testato con windows sette & Outlook 2007 SP2). Posso trascinare le email di rilascio a piacere a &.


PS: MSDN Extract per la classe ApplicationClass:

"Questa classe supporta l'infrastruttura .NET Framework e non è destinato ad essere utilizzato direttamente dal codice"

+1

So che Outlook.ApplicationClass è incorporato nella versione 14.0.0.0 ma questa non è la mia domanda. Posso trascinare mails ma se faccio cadere più mail vengono salvate in Outlook.Explorer ("come una sorta di lista") e voglio solo che venga mostrata la posta che trascino nella casella di testo. Al momento il foreach va da un elenco di Outlook.Explorer e mostra l'ultima posta dimenticata e voglio solo che venga mostrata la mia posta attiva. – jefsmi

+0

Puoi per favore precisare il tuo scenario? Nell'esempio iniziale stai trascinando una singola email mentre nel tuo ultimo commento sembra voler trascinare una selezione di più email. –

+0

Sto trascinando le email del firmatario. Il mio scrigno: [# 1]. Trascina email_1 nella casella di testo = OK ==> Cancella la casella di testo [# 2]. Trascina email_2 nella casella di testo = OK ==> Cancella la casella di testo [# 3]. Trascina email_1 nella casella di testo = NOT OK (mostra email_2). Questo è perché email_2 era l'ultima posta in ActiveExplorer e sarà l'ultimo oggetto MailItem nel mio ciclo foreach. – jefsmi

1

Ho aggiornato la risposta di L.B. Il suo DragEnter EventHandler presupponeva automaticamente che l'utente lasciasse qualcosa da Outlook.

Il risultato era che se l'utente lasciava cadere qualcos'altro (un file, un testo selezionato, ...), il codice guardava ancora alle e-mail attualmente selezionate in Outlook e ignorava ciò che era effettivamente caduto.

Il codice:

Private _Outlook As Outlook.Application = Nothing 

Private Sub Form_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load 
    _Outlook = New Outlook.Application() 
End Sub 

Private Sub Form_DragEnter(ByVal sender As Object, ByVal e As DragEventArgs) Handles Me.DragEnter 
    Dim outlookRequiredFormats = New String() { _ 
     "RenPrivateSourceFolder", _ 
     "RenPrivateMessages", _ 
     "RenPrivateItem", _ 
     "FileGroupDescriptor", _ 
     "FileGroupDescriptorW", _ 
     "FileContents", _ 
     "Object Descriptor"} 

    If outlookRequiredFormats.All(Function(requiredFormat) e.Data.GetDataPresent(requiredFormat)) Then 
     e.Effect = DragDropEffects.Copy 
    Else 
     e.Effect = DragDropEffects.None 
    End If 
End Sub 

Private Sub Form_DragDrop(ByVal sender As Object, ByVal e As DragEventArgs) Handles Me.DragDrop 
    Dim oExplorer As Outlook.Explorer = _Outlook.ActiveExplorer() 
    Dim oSelection As Outlook.Selection = oExplorer.Selection 
    Dim i As Integer = 0 
    For Each item As Object In oSelection 
     Dim mi As Outlook.MailItem = DirectCast(item, Outlook.MailItem) 
     mi.SaveAs("C:\YourPath\message" & i & ".msg") 
     i += 1 
    Next 

C'è un cast diretto del elemento di Outlook selezionato Outlook.MailItem. Il codice funziona quindi solo con e-mail effettive. È anche possibile gestire Outlook.MeetingItem, Outlook.ContactItem, Outlook.NoteItem e probabilmente di più.

Problemi correlati