我有以下问题。我有一个打开的窗口,允许我选择一些文件。然后我可以右键单击该窗口并选择将所选文件的路径附加到新的邮件对话框。
工作流程是这样的:
我打开我的窗口并选择几个文件
右键,选择将选中的文件路径添加到MailItem
逻辑将检查是否存在
ActiveInspector
3.1。如果有,我得到它
CurrentItem as MailItem
(所以,新的邮件对话框存在并且不需要创建)3.2. 如果没有,我调用
CreateItem(Microsoft.Office.Interop.OLItemType.olMailItem)
创建新的邮件对话框,然后调用MailItem.Display(false)
显示邮件项对话框接下来,我遍历选定文件路径列表并将它们添加到新邮件对话框中。这很好用。
问题如果我第二次打开我的窗口以选择更多文件并将它们的路径添加到我之前打开的同一个邮件对话框中,它们不会被添加。
这是代码:
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(" ");
}