2016-04-27 67 views
2

我有一個VSTO 插件(不是模板項目),我想結合進入事件手動添加到文檔中的任何內容的控制,但無法弄清楚如何做綁定。VSTO/WINWORD綁定到輸入事件DropDownListContentControl

這是很容易找到合適的內容控制:

ActiveDoc.ContentControls.Cast<ContentControl>() 
    .Where(cc => cc.Type == WdContentControlType.wdContentControlDropdownList) 

ContentControl中沒有任何事件可言,所以好像我需要以某種方式獲得DropDownListContentControl但還沒我無法弄清楚如何從ContentControl或任何其他來源獲取它。

  • 您不能只將ContentControl投射到DropDownListContentControl,因爲沒有父母的共同點。
  • 我想我可能能夠通過使用動態找到,但那些不支持事件。
  • 模板項目 ContentControls是使用Globals.Factory.CreateDropDownListContentControl創建的,但這似乎不適用於Addin項目。

我猜想有一些簡單的我錯過了,但幾小時的谷歌搜索迄今沒有結果。

TIA

回答

1

猜猜我只是看起來不夠長。要做到這一點,你需要使用這種包裝在一個容易混淆的命名Microsoft.Office.Tools.Word.DocumentMicrosoft.Office.Interop.Word.Document

Microsoft.Office.Tools.Word.Document doc 
    = Globals.Factory.GetVstoObject(Addins.Globals.Application.ActiveDocument); 

那類有一組會產生比原生控制多個事件的包裝方法。所以,在任何droplist得到一個事件,你這樣做:

 Microsoft.Office.Tools.Word.Document doc = Globals.Factory.GetVstoObject(ActiveDoc); 
     foreach (ContentControl cc in ActiveDoc.ContentControls) { 
      if (cc.Type == WdContentControlType.wdContentControlDropdownList) { 
       var dropList = doc.Controls.AddDropDownListContentControl("MyControl"); 
       dropList.Tag = "MyControl"; 
       dropList.Entering += (sender, args) => { 
        var that = (DropDownListContentControl) sender; 
        Debug.Print("Entering: " + that.Tag); 
       }; 
      } 
     } 

這一切就是這麼簡單,除了控件本身是從可用性的角度來看非常可怕的。

請參閱Host Items and Host Controls Overview

0
Document extendedDocument = Globals.Factory.GetVstoObject(Application.ActiveDocument); 
int nIdx=0; 
foreach(Word.ContentControl ctrl in Application.ActiveDocument.ContentControls) 
{ 
ContentControl newCC = 

extendedDocument.Controls.AddContentControl(ctrl, "contentControlName"+nIdx.ToString()); 
    newCC.Entering += new ContentControlEnteringEventHandler(enteringEventHanlder); 
    nIdx++; 
} 

它是將原生內容控制轉換爲內容控制的代碼。 它可能會幫助你。

+0

很酷,謝謝。我一直在發現我主要討厭內容控制,因爲他們的用戶體驗很糟糕,但我必須偶爾做,所以這是一個方便的提示。 –