Как отключить вкладку «Сохранить как» в Word 2016

#c# #ms-word #vsto

#c# #ms-word #vsto

Вопрос:

У меня есть надстройка VSTO, которую я разработал для Word 2010, и в настоящее время я нахожусь в процессе обновления до Office 2016. Одна из вещей, которые я делаю, это в XML-файле ленты отключить команду «Сохранить как» (<command idMso=»FileSaveAs» getEnabled=»IsFileSaveAsEnabled» …>) для определенных документов. Однако, похоже, что Microsoft добавила новую вкладку «Сохранить как» в представление backstage в Word 2016, которую я не могу динамически отключить.

Отключение команды «Сохранить как» влияет на кнопку «Сохранить как», если она добавлена на панель быстрого доступа, но не влияет на вкладку в фоновом режиме. Я пытался изменить другие вещи на этой вкладке, и, похоже, она игнорирует любые изменения, которые я пытаюсь внести.

Я разрабатываю в VS 2017 и автоматически перенес проект в Office 2016.

Если я добавлю

 <backstage>
    ...
    <tab idMso="TabSave" getEnabled="IsFileSaveEnabled" />
    ...
</backstage>
  

к моему ribbon.xml IsFileSaveEnabled не вызывается.

 public bool IsFileSaveEnabled(IRibbonControl control) 
{
    return false; // Not the actual implementation, but you get the idea.
}
  

На самом деле даже установка для атрибута enabled значения false ничего не дает, однако это

 <backstage>
    ...
    <tab idMso="TabSave" visible="false" />
    ...
</backstage>
  

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

Так что, просто невозможно отключить эту вкладку так, как я хочу, или есть что-то новое, что мне нужно сделать? Я не могу найти что-либо еще в Интернете по этому поводу.

Ответ №1:

Я собираюсь ответить на свой собственный вопрос здесь, поскольку я думал об обходном пути. Вместо того, чтобы пытаться взаимодействовать со встроенной вкладкой «Сохранить как», я просто собираюсь навсегда скрыть ее и добавить свою собственную копию этой вкладки, которую я создаю с нуля, чтобы выглядеть и вести себя точно так же, как встроенная вкладка. Немного больше работы, но не могу придумать другого способа сделать это.

Ответ №2:

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

 <tab idMso="TabSave" getVisible="procedureName" />
  

Эта процедура должна быть в Ribbon1.cs (или независимо от того, какой класс вызывается в вашем проекте VSTO), а логика для отображения элемента управления (или нет) — такая же, как IsFileSaveEnabled . Обратный вызов запускается при первой загрузке ленты, и в любое время элемент управления (или вся лента) становится недействительным ( Ribbon.Invalidate / InvalidateControl(controlID) ). Обычно это делается в таких событиях, как DocumentOpen, DocumentClose, DocumentChange и т. Д.

Я предполагаю, что у вас уже есть процедуры для инициализации Ribbon объекта в вашем коде ( GetCustomUI и Ribbon_Load ).

Вот простой пример, который у меня есть в тестовом проекте, который переключает видимость группы:

     private Office.IRibbonUI ribbon; //initialized via Ribbon's load event
    bool bGetVisible = false;

    //triggered by clicking a Ribbon control
    public void ShowFontGroup_Click(Office.IRibbonControl ctl)
    {
        bGetVisible = true;
        ribbon.Invalidate(); //triggers all "get" callbacks in the Ribbon
    }

    //callback triggered by invalidating the Ribbon
    public bool GroupFont_GetVisible(Office.IRibbonControl ctl)
    {
        return bGetVisible;
    }
  

Комментарии:

1. Моя проблема в том, что обратный вызов не вызывается для TabSave, даже если я использую ленту. Аннулировать. TabSave не существовал в Office 2010, поэтому, должно быть, был новым в 2013 или 2016 году. В 2010 году Сохранить как было просто командой за кулисами, поэтому отключение команды сделало то, что мне было нужно. В 2016 году «Сохранить как» — это вкладка, которая, похоже, ведет себя не так, как другие встроенные вкладки. Интересно, знает ли кто-нибудь, почему и есть ли способ обойти это.

Ответ №3:

У меня нет Word 2016, поэтому я не могу это проверить, но вы, вероятно, могли бы перехватить событие сохранения и прервать, когда оно сохраняется как.

 // this is for a document-level add-in; do this in your startup method
BeforeSave  = new SaveEventHandler(ThisDocument_BeforeSave);

private void ThisDocument_BeforeSave(object sender, SaveEventArgs e)
{
    e.Cancel = e.ShowSaveAsDialog;
    return;
}
  

Я делаю нечто подобное в своей надстройке, и это работает хорошо.