我已经编写了一个简单的VSTO插件,当用户单击一个功能区栏按钮时,将超链接插入电子邮件。下面是一个代码示例:在Outlook阅读窗格中访问正在编辑的文档
private void button1_Click(object sender, RibbonControlEventArgs e)
{
var context = e.Control.Context as Inspector;
if (context != null)
{
if (context.IsWordMail())
{
var doc = context.WordEditor as Document;
if (doc != null)
{
var sel = doc.Windows[1].Selection;
doc.Hyperlinks.Add(sel.Range, "http://www.google.com", "", "", "Google", "");
}
}
}
else if (e.Control.Context is Explorer)
{
Explorer explorer = Globals.ThisAddIn.Application.ActiveExplorer();
if (explorer.Selection.Count == 1)
{
Microsoft.Office.Interop.Outlook.Selection itemSelection = explorer.Selection;
var item = itemSelection[1] as MailItem;
// get the instance of WordEditor in a reading pane?
}
}
}
这种运作良好,当电子邮件是在一个单独窗口(e.Control.Context is Inspector
)被编辑。
如果消息话题被回复/转发和阅读窗格被接通时,在阅读窗格(e.Control.Context is Explorer
)内联显示的编辑器。
我无法弄清楚在这种情况下如何获得Document
的实例。我可以访问在资源管理器中选择的项目,但我无法确定如何访问正在阅读窗格中显示的文档编辑器。
如果我'编辑'弹出'到一个单独的窗口,它工作正常(上下文更改为检查器)。
有没有方法可以访问直接在阅读窗格中编辑的电子邮件文档?
与Dmitry谁指出我在正确的方向,我发现有一个资源类的属性有很大的帮助:Explorer.ActiveInlineResponseWordEditor
它给你的编辑器内嵌显示。
我试过第一种方法,但我得到COMException:内存不足。经过一番实验后,我发现当编辑器嵌入到主窗口中时,没有文件操作是可能的,并且只要我弹出窗口,相同的代码就可以工作。例如: 'Document.Paragraphs [1] .Range.Delete()'是投掷以下收到COMException:因为文档被锁定用于编辑 此方法或属性不可用。 在单独的窗口中,它正确删除第一段。 – Stefan
你不期待吗?预览窗格是只读的。 –
确实如此,但是当我回复时,编辑器直接显示在阅读窗格中,而且该编辑器显然不是只读的。如果我在通过MailItem.GetInspector()获取的文档上调用Document.Unprotect().WordEditor,则不会抛出异常,但是在尝试操作它时文本不会更改,因此它必须是不同的编辑器实例在阅读(编辑?)窗格中。 – Stefan