Я работаю с WPF и пытаюсь создать текстовое поле с перетаскиванием.
В этом текстовом поле я хочу получить тело письма, которое я перетаскиваю из Outlook.
Код работает, но я думаю, что мне нужно что-то, чтобы "сбросить" ActiveExplorer, потому что теперь он показывает только последнее "НОВОЕ" электронное письмо, которое я перетаскиваю в текстовое поле.
Пример:
Перетащите электронную почту 1 -> Текстовое поле - показывает электронную почту 1
Перетащите электронное письмо 2 -> Текстовое поле - показывает электронное письмо 2
Перетащите электронную почту 1 -> Текстовое поле - показывает электронную почту 2, а электронная почта 1 не будет отображаться, потому что она уже существует в ActiveExplorer, и она покажет электронную почту 2.
Надеюсь, мой вопрос вам немного ясен..
Заранее спасибо!
XAML-код:
<TextBox
Name="myTextbox"
AllowDrop="True"
PreviewDragEnter="email_DragEnter"
PreviewDrop="email_Drop" />
Код XAML позади:
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();
}
}
Ответ 1 · рейтинг 9 · L.B
Я переместил объявление oApp из события DragDrop, как показано ниже, и оно работает, как и ожидалось.
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");
}
}
--------РЕДАКТИРОВАТЬ--------
ИЛИ Возможно ли, что вы отображаете только последний элемент из-за этого цикла?
foreach (object item in oSelection)
{
Outlook.MailItem mi = (Outlook.MailItem)item;
myTextbox.Text = mi.Body.ToString(); //<--- Only last items text
}
Ответ 2 · рейтинг 1 · Laoujin
Я обновил ответ LB. Его DragEnter EventHandler автоматически предположил, что пользователь добавил что-то из Outlook.
В результате, если пользователь вставлял что-то еще (файл, выделенный текст и т. д.), код все равно просматривал выбранные в данный момент электронные письма в Outlook и игнорировал то, что на самом деле было удалено.
Код:
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
Существует прямое приведение выбранного элемента Outlook к Outlook.MailItem. Таким образом, код работает только с реальными электронными письмами. Также можно обрабатывать Outlook.MeetingItem, Outlook.ContactItem, Outlook.NoteItem и, возможно, больше.
Ответ 3 · Timothée Bourguignon
Используя версию 14.0.0.0 Microsoft.Office.Interop.Outlook.dll, я не могу использовать объект Outlook.ApplicationClass.
Вместо этого я использовал Outlook.Application в приведенном вами примере, и он работает как шарм (протестировано с Windows 7 и Outlook 2007 SP2). Я могу перетаскивать электронные письма по желанию.
PS: Извлечение MSDN для класса ApplicationClass:
Этот класс поддерживает инфраструктуру .NET Framework и не предназначен для непосредственного использования в вашем коде