Изменение доступности команд надстроек
Если некоторые функции надстройки должны быть доступны только в определенных контекстах, можно программно настроить пользовательские команды надстройки так, чтобы они были доступны только в этих контекстах. Например, функция, изменяющая заголовок таблицы, должна быть доступна только в том случае, если курсор находится в таблице.
Примечание.
- В этой статье предполагается, что вы знакомы с основными понятиями команд надстроек. Просмотрите его, если вы не работали с командами надстройки (настраиваемые пункты меню и кнопки ленты) в последнее время.
Поддерживаемые возможности
Вы можете программно изменить доступность команды надстройки для следующих возможностей.
- Кнопки, меню и вкладки ленты.
- Элементы контекстного меню.
Поддержка приложений Office и набора требований
В следующей таблице описаны приложения Office, которые поддерживают настройку доступности команд надстроек. В нем также перечислены наборы требований, необходимые для использования API.
Возможность команд надстройки | Набор обязательных элементов | Поддерживаемые приложения Office |
---|---|---|
Кнопки, меню и вкладки на ленте | RibbonApi 1.1 |
|
Элементы контекстного меню | ContextMenuApi 1.1 |
|
Совет
Сведения о том, как протестировать поддержку платформы с наборами требований, см. в статье Версии Office и наборы требований.
Настройка общей среды выполнения
Чтобы изменить доступность ленты или элемента контекстного меню, необходимо сначала настроить манифест надстройки на использование общей среды выполнения. Инструкции по настройке общей среды выполнения см. в статье Настройка надстройки Office для использования общей среды выполнения.
Программное изменение доступности команды надстройки
Отключение элементов управления ленты при запуске
Примечание.
При запуске приложения Office можно отключить только элементы управления на ленте. Вы не можете отключить пользовательские элементы управления, добавленные в контекстное меню при запуске.
По умолчанию настраиваемая кнопка или пункт меню на ленте доступны для использования при запуске приложения Office. Чтобы отключить его при запуске Office, необходимо указать его в манифесте. Процесс зависит от типа манифеста, используемого надстройкой.
Унифицированный манифест для Microsoft 365
Примечание.
Унифицированный манифест для Microsoft 365 можно использовать в рабочих надстройках Outlook. Он доступен только в качестве предварительной версии для надстроек Excel, PowerPoint и Word.
Просто добавьте свойство "enabled" со значением false
в объект элемента управления или элемента меню. Ниже показана базовая структура.
"extensions": [
...
{
...
"ribbons": [
...
{
...
"tabs": [
{
"id": "MyTab",
"groups": [
{
...
"controls": [
{
"id": "Contoso.MyButton1",
...
"enabled": false
}
]
}
]
}
]
}
]
}
]
Манифест только надстройки
Просто добавьте элемент Enabled непосредственно под элементом Action элемента управления (не внутри). Затем присвойте ей false
значение .
Ниже показана базовая структура манифеста, который настраивает <элемент Enabled> .
<OfficeApp ...>
...
<VersionOverrides ...>
...
<Hosts>
<Host ...>
...
<DesktopFormFactor>
<ExtensionPoint ...>
<CustomTab ...>
...
<Group ...>
...
<Control ... id="Contoso.MyButton3">
...
<Action ...>
<Enabled>false</Enabled>
...
</OfficeApp>
Изменение доступности элемента управления ленты
Чтобы обновить доступность кнопки или пункта меню на ленте, выполните следующие действия.
- Создайте объект RibbonUpdaterData , указывающий следующее:
- Идентификаторы команды, включая ее родительскую группу и вкладку. Идентификаторы должны соответствовать идентификаторам, объявленным в манифесте.
- Состояние доступности команды.
- Перенесите объект RibbonUpdaterData в метод Office.ribbon.requestUpdate().
Ниже приведен простой пример. Обратите внимание, что myButton, OfficeAddinTab1 и CustomGroup111 копируются из манифеста.
function enableButton() {
const ribbonUpdaterData = {
tabs: [
{
id: "OfficeAppTab1",
groups: [
{
id: "CustomGroup111",
controls: [
{
id: "MyButton",
enabled: true
}
]
}
]
}
]
};
Office.ribbon.requestUpdate(ribbonUpdaterData);
}
Существует несколько интерфейсов (типов), которые упрощают создание объекта RibbonUpdateData .
Ниже приводится аналогичный пример в TypeScript, в котором используются эти типы.
const enableButton = async () => {
const button: Control = { id: "MyButton", enabled: true };
const parentGroup: Group = { id: "CustomGroup111", controls: [button] };
const parentTab: Tab = { id: "OfficeAddinTab1", groups: [parentGroup] };
const ribbonUpdater: RibbonUpdaterData = { tabs: [parentTab] };
Office.ribbon.requestUpdate(ribbonUpdater);
}
Совет
Вы можете await
вызвать requestUpdate(), если родительская функция является асинхронной, но обратите внимание, что приложение Office управляет обновлением состояния ленты. Метод requestUpdate() ставит запрос на обновление в очередь. Метод разрешает объект promise сразу же, как только он помещает запрос в очередь, а не при фактическом обновлении ленты.
Одновременное включение видимости вкладки и состояние включенной кнопки
Метод requestUpdate также используется для переключения видимости пользовательской контекстной вкладки. Дополнительные сведения об этом и примере кода см. в статье Создание пользовательских контекстных вкладок в надстройках Office.
Изменение состояния в ответ на событие
Распространенный сценарий, в котором должно измениться состояние ленты или элемента управления контекстным меню, — это когда инициируемое пользователем событие изменяет контекст надстройки. Рассмотрим сценарий, в котором кнопка должна быть доступна только при активации диаграммы. Хотя в следующем примере используются элементы управления ленты, аналогичную реализацию можно применить к пользовательским элементам в контекстном меню.
Сначала присвойте элементу< Enabled> для кнопки в манифесте значение
false
. Инструкции по настройке см. в разделе Отключение элементов управления ленты при запуске.Затем назначьте обработчики. Обычно это делается в функции Office.onReady , как показано в следующем примере. В этом примере обработчики (созданные на более позднем шаге) назначаются событиям onActivated и onDeactivated всех диаграмм на листе Excel.
Office.onReady(async () => { await Excel.run((context) => { const charts = context.workbook.worksheets .getActiveWorksheet() .charts; charts.onActivated.add(enableChartFormat); charts.onDeactivated.add(disableChartFormat); return context.sync(); }); });
Определите
enableChartFormat
обработчик. Ниже приведен простой пример. Более надежный способ изменения состояния элемента управления см. в статье Рекомендации по проверке ошибок состояния элемента управления.function enableChartFormat() { const button = { id: "ChartFormatButton", enabled: true }; const parentGroup = { id: "MyGroup", controls: [button] }; const parentTab = { id: "CustomChartTab", groups: [parentGroup] }; const ribbonUpdater = { tabs: [parentTab] }; Office.ribbon.requestUpdate(ribbonUpdater); }
Определите
disableChartFormat
обработчик. Он идентичен обработчикуenableChartFormat
, за исключением того, что свойство enabled объекта button имеет значениеfalse
.
Рекомендация: проверка на наличие ошибок в состоянии элементов управления
В некоторых случаях лента или контекстное меню не перекрашивали после requestUpdate
вызова, поэтому состояние элемента управления не изменяется. По этой причине для надстройки рекомендуется отслеживать состояние своих элементов управления. Надстройка должна соответствовать следующим правилам.
- При вызове
requestUpdate
в коде указывается предполагаемое состояние настраиваемых кнопок и элементов меню. - При выборе пользовательского элемента управления первый код в обработчике должен проверка, чтобы узнать, должна ли кнопка быть доступна. Если он не должен был быть доступен, код должен сообщить об ошибке или записать ее в журнал и повторить попытку, чтобы задать для кнопок требуемое состояние.
В следующем примере показана функция, которая отключает кнопку на ленте и записывает состояние кнопки. В этом примере — это глобальная логическая переменная, chartFormatButtonEnabled
которая инициализирована тем же значением, что и элемент Enabled для кнопки в манифесте надстройки. Хотя в примере используется кнопка ленты, аналогичную реализацию можно применить к пользовательским элементам в контекстном меню.
function disableChartFormat() {
const button =
{
id: "ChartFormatButton",
enabled: false
};
const parentGroup =
{
id: "MyGroup",
controls: [button]
};
const parentTab =
{
id: "CustomChartTab",
groups: [parentGroup]
};
const ribbonUpdater = { tabs: [parentTab] };
Office.ribbon.requestUpdate(ribbonUpdater);
chartFormatButtonEnabled = false;
}
В приведенном ниже примере показано, как обработчик кнопки проверяет ее на наличие неправильного состояния. Обратите внимание, что reportError
— это функция, которая отображает или записывает в журнал ошибку.
function chartFormatButtonHandler() {
if (chartFormatButtonEnabled) {
// Do work here.
} else {
// Report the error and try to make the button unavailable again.
reportError("That action is not possible at this time.");
disableChartFormat();
}
}
Обработка ошибок
В некоторых сценариях Office не удается обновить ленту или контекстное меню и возвращает ошибку. Например, если после обновления у надстройки другой набор настраиваемых команд, приложение Office необходимо закрыть и снова открыть. Пока это действие не будет выполнено, метод requestUpdate
будет возвращать ошибку HostRestartNeeded
. Ниже приведен пример обработки этой ошибки. В этом случае метод reportError
выводит сообщение об ошибке для пользователя. Хотя в примере используется кнопка ленты, аналогичную реализацию можно применить к пользовательским элементам в контекстном меню.
function disableChartFormat() {
try {
const button =
{
id: "ChartFormatButton",
enabled: false
};
const parentGroup =
{
id: "MyGroup",
controls: [button]
};
const parentTab =
{
id: "CustomChartTab",
groups: [parentGroup]
};
const ribbonUpdater = { tabs: [parentTab] };
Office.ribbon.requestUpdate(ribbonUpdater);
chartFormatButtonEnabled = false;
}
catch(error) {
if (error.code == "HostRestartNeeded"){
reportError("Contoso Awesome Add-in has been upgraded. Please save your work, close the Office application, and restart it.");
}
}
}
См. также
Office Add-ins