2016-04-27 2 views
2

У меня есть VSTO надстройку (не шаблон проекта), и я хотел бы связываться с Ввод событие для каких-либо элементов управления содержимым вручную добавлены в документ, но не могу понять, как сделать привязку.VSTO/WinWord Bind Ввод событие для DropDownListContentControl

Это достаточно легко найти соответствующие управления содержимым:

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

ContentControl не имеют каких-либо событий на всех, так что кажется, что мне нужно как-то получить DropDownListContentControl но я гаванью» t удалось выяснить, как получить это из ContentControl или любого другого источника.

  • Вы не можете просто передать ContentControl в DropDownListContentControl, потому что нет общих родителей.
  • Я думал, что я мог бы быть в состоянии найти с помощью динамического, но те не поддерживают события.
  • В Проекты шаблонов ContentControls создаются с использованием Globals.Factory.CreateDropDownListContentControl, но это, похоже, не работает для проектов Addin.

Я предполагаю, что есть что-то простое, что мне не хватает, но часы работы в Интернете были бесплодны до сих пор.

ТИА

ответ

1

Guess я просто не смотрел достаточно долго. Для этого вам нужно обернуть Microsoft.Office.Interop.Word.Document в степени смешения с именем Microsoft.Office.Tools.Word.Document с помощью этого:

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

Этот класс имеет набор методов, которые будут генерировать обертку с большим количеством событий, чем встроенные элементы управления. Таким образом, чтобы получить событие на любом выпадающего списка, вы делаете что-то вроде:

 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

Круто, спасибо. Я находил я в основном ненавижу управление контентом, потому что их пользовательский опыт ужасен, но я должен сделать их время от времени, так что это полезный совет. –

Смежные вопросы