VSTO: почему OfficeRibbon.Context имеет значение null?

Я разрабатываю свою первую надстройку для Word 2007 и добавил в свой проект ленту OfficeRibbon. В обработчике нажатия кнопки мне нужна ссылка либо на текущий Word.Document, либо на Word.Application.

Я пытаюсь получить ссылку через свойство OfficeRibbon.Context, которое, согласно документации, должно относиться к текущему объекту Application. Однако это всегда null.

Кто-нибудь знает либо

а) нужно ли мне что-то сделать, чтобы OfficeRibbon.Context отображалось правильно заполненным?
б) есть ли другой способ получить ссылку на приложение Word или активный документ Word?

Примечания:

  • Я использую VS2008 SP1

  • Лента выглядит так, как будто она инициализирована нормально: Лента правильно отображается в Word; Я могу выполнить отладчик как через конструктор, так и через элементы OnLoad; Обработчики нажатия кнопок выполняются правильно.

  • Вот онлайн-справка для этого свойства;

Свойство OfficeRibbon.Context

C#
public Object Context { get; internal set; }

Объект, представляющий окно Inspector или экземпляр приложения, связанный с этим объектом OfficeRibbon.

Примечания

В Outlook это свойство относится к окну Inspector, в котором отображается эта лента OfficeRibbon.

В Excel, Word и PowerPoint это свойство возвращает экземпляр приложения, в котором отображается этот OfficeRibbon.


person Steve Cooper    schedule 31.10.2008    source источник


Ответы (4)


Я также столкнулся с этой проблемой при создании надстройки Excel 2007 с использованием VS2008 SP1. Обходной путь, который я использовал, заключался в том, чтобы сохранить приложение в свойстве internal static в основном классе AddIn, а затем сослаться на него в обработчике событий на моей ленте:

public partial class ThisAddIn
{
    internal static Application Context { get; private set; }

    private void ThisAddIn_Startup(object sender, System.EventArgs e)
    {
        Context = Application;
    }
    ...
}

public partial class MyRibbon : OfficeRibbon
{
    private void button1_Click(object sender, RibbonControlEventArgs e)
    {
        DoStuffWithApplication(ThisAddIn.Context);
    }
    ...
}
person Joseph Sturtevant    schedule 21.05.2009

Попробуйте сослаться на документ с помощью:

Globals.ThisDocument.[some item]

Справочник MSDN

person Michael Regan    schedule 22.05.2009

Получите это от:

Globals.ThisAddIn.Application

person Lukas Winzenried    schedule 13.06.2012

Хотя я мало что знаю об изменениях в объектной модели Word в Office 2007, вот мое объяснение, основанное на знаниях VBA.

Приложение является глобально доступным объектом. Кроме того, Application.ActiveDocument должен предоставить вам доступ к текущему документу.

Размышление: как вы пытаетесь добавить ленту?

person shahkalpeshp    schedule 02.11.2008