Привязка VSTO/WinWord к входному событию для DropDownListContentControl

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

Достаточно легко найти подходящие элементы управления контентом:

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

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

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

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

ТИА


person Wade Hatler    schedule 27.04.2016    source источник


Ответы (2)


Думаю, я просто не смотрел достаточно долго. Для этого вам нужно обернуть 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);
                };
            }
        }

Вот и все, за исключением того, что сами элементы управления довольно ужасны с точки зрения удобства использования.

См. Обзор элементов хоста и элементов управления хоста. .

person Wade Hatler    schedule 28.04.2016

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++;
}

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

person 강재규    schedule 28.12.2016
comment
Хорошо, спасибо. Я обнаружил, что в основном ненавижу элементы управления контентом, потому что их пользовательский интерфейс ужасен, но мне приходится иногда использовать их, так что это удобный совет. - person Wade Hatler; 28.12.2016