我已經編寫了一個簡單的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