Как настраиваемая панель задач может отображать видимость при сохранении пользовательского интерфейса?

Я пытаюсь добавить пользовательскую панель задач в надстройку Excel, которая предназначена для работы аналогично панели сводных таблиц.

Предполагается, что при выборе таблицы пользовательская панель должна появиться и должна исчезнуть. Для этого я создал пользовательскую панель задач:

this._taskPane = Globals.AddIn.CustomTaskPanes.Add(
    new TableTaskPane(),
    "FooPane");
this._taskPane.DockPositionRestrict
    = MsoCTPDockPositionRestrict.msoCTPDockPositionRestrictNoHorizontal;

Когда таблица выбрана, панель становится видимой, а при ее выборе панель скрыта:

ListObject table = AddTable(); // Creates the table and populates with data.

table.Selected += range => this._taskPane.Visible = true;
table.Deselected += range => this._taskPane.Visible = false;

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

Кажется, это связано с тем, что установщик из свойства Visible блокирует до тех пор, пока область задач не завершит переход. В Excel 2013 он открывается со стороны окна, который занимает около 500 мс.

Я не вижу никакого способа изменить это поведение - я попытался настроить параметры свойства в потоке STA, но он вызывает ту же блокировку. Я был бы рад изменить панель задач так, чтобы она сразу появилась без перехода (например, в панель Pivot Table), но я ничего не вижу, чтобы это произошло.

Я делаю это неправильно? Есть ли способ исправить это с помощью прямого COM или какого-либо другого тонко-скрытого поведения?

Ответы

Ответ 1

Вы можете выполнить это (и даже повысить производительность), отключив глупые функции анимации окон, найденные здесь: Панель управления → Система и безопасность → Система → Расширенные настройки → Настройки производительности → Визуальные эффекты.

В этом конкретном случае, я считаю, вам нужно отключить это:

  • Анимация элементов управления и элементов внутри окон.

Но это также отлично подходит для ускорения:

  • Вывести или переместить меню в режим просмотра
  • Сдвинуть открытые комбо-боксы
  • Анимировать окна при минимизации и максимизации.

Ответ 2

Вы должны иметь возможность установить ширину панели на ноль либо через API панели, либо сбой, использующий набор инструментов Windows API SetWindowPos. Затем измените видимость. Я не использую VSTO, но знаю, что это можно сделать, используя необработанные объекты Office Pane.