Почему VSTO Word ContentControl не имеет свойства Name? - PullRequest
1 голос
/ 19 февраля 2011

Когда вы добавляете VSTO (не Word родной) контроль содержимого , вы указываете имя:

controls.AddContentControl(wordRange, "foo", wdType);

Где элементы управления - VSTO (расширенный)Коллекция Document.Controls.

Позже вы можете найти элемент управления по имени:

ContentControl myContentControl = controls["foo"];

Так почему же в мире нет свойства Name для ContentControl?(или ContentControlBase, или любые другие производные).

Я реализую класс-оболочку для свойства Document.Controls, которое позволяет добавлять или перебирать элементы управления содержимым.При выполнении итерации базового Document.Controls невозможно найти имя каждого элемента управления.(Нам нужно вернуть экземпляр нашей оболочки ContentControl).Поэтому в настоящее время я делаю это в нашем классе-обертке ContentControls:

    public IEnumerator<IContentControl> GetEnumerator()
    {
        System.Collections.IEnumerator en = this.wordControls.GetEnumerator();
        while (en.MoveNext())
        {
            // VSTO Document.Controls includes all managed controls, not just 
            // VSTO ContentControls; return only those.
            if (en.Current is Microsoft.Office.Tools.Word.ContentControl)
            {
                // The control's name isn't stored with the control, only when it was added,
                // so use a placeholder name for the wrapper.
                yield return new ContentControl("Unknown", (Microsoft.Office.Tools.Word.ContentControl)en.Current);
            }
        }
    }

Я бы предпочел не прибегать к хранению карты имен-оберток-объектов в нашем объекте ContentControls.Может кто-нибудь сказать мне, как получить имя элемента управления (параметр имени, который был передан в Controls.Add ()?

1 Ответ

4 голосов
/ 19 февраля 2011

Аргумент "name" предназначен исключительно для простоты манипулирования, когда вы программно добавляете CC и затем нуждаетесь в немедленном доступе к нему во время того же экземпляра Word. После-фактический доступ к CC осуществляется через GUID в свойстве ContentControl.ID. Таким образом, в этом смысле «имя» довольно бесполезно для последующего доступа и манипулирования, поскольку оно не сохраняется в разметке WordprocessingML.

Более простой способ приблизиться к этому - просто игнорировать обозначение «имя» все вместе, добавить CC, взять его .ID и затем использовать его. Конечно, Guid не имеет смысла для читателя, но ваша программа должна быть в состоянии это учитывать.

Если вам действительно нужно получить CC по значимому имени, например, "foo", просто используйте свойство .Tag для имени вашего CC (оно должно быть уникальным для каждой CC, хотя ваши теги должны работать как имена) и запросите ContentControlCollection по тегам.

...