У меня возникла следующая проблема. У меня есть окно, которое открывается и позволяет мне выбирать некоторые файлы. Затем я могу щелкнуть правой кнопкой мыши по этому окну и выбрать подключение путей выбранных файлов к новому диалоговому окну.Outlook VSTO - Добавление пути к файлу/гиперссылки на MailItem WordEditor из Outlook VSTO
Рабочий процесс выглядит так:
Я открываю окна и выберите несколько файлов
правой кнопкой мыши, выберите команду, чтобы добавить выбранные файлы пути к MailItem
логика проверьте, есть ли
ActiveInspector
3.1. Если он есть, я получаю его
CurrentItem as MailItem
(так что новый диалог почты существует и его не нужно создавать)3.2. Если его нет, я называю
CreateItem(Microsoft.Office.Interop.OLItemType.olMailItem)
создать новый диалог почты, а затем я называюMailItem.Display(false)
, чтобы отобразить пункт почтыдиалоговоеСледующая I цикл по списку выбранных файлов дорожек и добавить их в новом окне почты. Это отлично работает.
ПРОБЛЕМА Если я открываю окно для 2-й раз, чтобы выбрать несколько файлов и добавить их пути к тому же диалоге почты я открыл ранее, они не добавляются.
Вот код:
public void AddFilePaths(List<string> paths)
{
if (paths.Count > 0)
{
var inspector = MyAddIn.Application.ActiveInspector();
MailItem mi = null;
bool newMailItem = false;
if (inspector != null)
{
// If new mail dialog is already open, just get it.
// This is called on my 2nd attempt to add paths to new mail.
// This MailItem is the same one created on 1st call in below
// else block. I confirmed that by adding some dummy email
// Body in below else block, then checking for it here on
// 2nd call. I think this proves that correct
// Inspector/MailItem is returned here.
mi = MyAddIn.Application.ActiveInspector().CurrentItem as MailItem;
}
else
{
// create new mail dialog and display it
// this is called on my 1st call to add paths to new mail
mi = MyAddIn.Application.CreateItem(Microsoft.Office.Interop.Outlook.OlItemType.olMailItem);
mi.Body = "Dummy email body";
newMailItem = true;
}
if (newMailItem)
{
mi.Display();
inspector = MyAddIn.Application.ActiveInspector();
}
if (inspector != null)
{
foreach (var path in paths)
{
AddPathToActiveInspector(path);
}
}
}
}
выше код вызывает этот метод, чтобы добавить путь к текущему ActiveInspector
WordEditor
:
public void AddPathToActiveInspector(string path)
{
var inspector = MyAddIn.Application.ActiveInspector();
dynamic we = inspector.WordEditor;
dynamic word = we.Application;
const string nl = "\n";
// I have noticed that if I am debugging, this line will throw error
// "COMException was unhandled by user code", "An exception of type
// System.Runtime.Interop.Services.COMException occurred in
// System.Dynamic.dll but was not handled by user code:
// Message: This command is not available
// InnerException: null
// I have also seen following error on 2nd attempt: "The TypeText
// method or property is not available because the document is
// locked for editing."
word.Selection.TypeText(nl);
string address = path;
string subAddress = "";
string screenTip = "";
string displayText = path;
word.ActiveDocument.Hyperlinks.Add(word.Selection.Range, ref address, ref subAddress, ref screenTip, ref displayText);
word.Selection.TypeText(" ");
}
Итак, что произойдет, если вы пройдете через свой код? Это действительно работает? Вы уверены, что есть только один инспектор? Что вы делаете с inline-ответами –
Спасибо, Дмитрий, см. Мой обновленный вопрос. Я проследил код, и я получил правильный инспектор/MailItem, который я подтвердил, добавив фиктивное сообщение MailItem.Body, когда MailItem создан (при первом вызове), а затем проверяя Body для этого текста во втором вызове. Я добавил это в мой комментарий к коду выше. Я также обнаружил, что вызывается COMException, но только при отладке (???).Я добавил комментарий в свой код для этого. В разделе «Ответы и переходы» (встроенные ответы) ничего не проверяется, и я включаю исходный текст сообщения (если это то, что вы имели в виду с встроенными ответами. Большое спасибо – pixel