#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;
}
Я делаю нечто подобное в своей надстройке, и это работает хорошо.