Настраиваемая панель задач с несколькими открытыми книгами

Я успешно реализовал образец Microsoft «Пошаговое руководство: синхронизация настраиваемой панели задач с кнопкой ленты», который можно найти здесь: http://msdn.microsoft.com/en-us/library/bb608590.aspx

Сначала я столкнулся с проблемой, когда панель задач не отображалась, что оказалось результатом некоторого конфликта между моей надстройкой и Microsoft «Пакет инструментов анализа». Как только я отключил Analysis Toolpack, настраиваемая панель задач начала отображаться и скрываться, как и ожидалось.

Затем я написал код для изменения ячеек в выбранном диапазоне, когда пользователь нажимает кнопку. Казалось, что это сработало просто отлично - пока я не открыл другую рабочую тетрадь! Каждое окно книги имеет собственную ленту надстройки, но когда я нажимаю кнопку-переключатель, чтобы открыть / закрыть настраиваемую панель задач, она открывала / закрывала настраиваемую панель задач только для первого созданного окна. Это независимо от того, в каком окне я нажимаю кнопку-переключатель.

Код создает экземпляр объекта CustomTaskPane в ThisAddIn_Startup (как в примере кода). Единственное, что я добавил, - это действие кнопки в UserControl:

using xl = Microsoft.Office.Interop.Excel;

namespace SynchronizeTaskPaneAndRibbon
{
    public partial class TaskPaneControl : UserControl
    {
        public TaskPaneControl()
        {
            InitializeComponent();
        }

        private void actionButton1_Click(object sender, EventArgs e)
        {
            xl.Range selection_rng = Globals.ThisAddIn.Application.Selection;

            foreach (xl.Range cell in selection_rng.Cells)
            {
                if (cell.Value is string)
                {
                    string v = cell.Value;
                    cell.Value = v + "*";
                }
            }
        }
    }
}

Остальной код такой же, как в примере.

Есть ли способ изменить пример, чтобы он работал для открытия нескольких книг? Я хочу, чтобы одна и та же надстройка отображалась в каждом окне книги, с одной и той же лентой и с одной и той же настраиваемой панелью. И, конечно же, чтобы любые действия на ленте (например, нажатие кнопки) направлялись к настраиваемой панели задач, которая отображается в том же окне.


person GaryP    schedule 19.12.2014    source источник


Ответы (1)


Да, есть еще один пример в MSDN, в котором говорится об управлении настраиваемыми панелями задач в нескольких документах. Обратите внимание, что это с точки зрения Word / InfoPath, но основная идея будет такой же и для Excel.

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

Ссылка: https://msdn.microsoft.com/en-us/library/bb264456(v=office.12).aspx?f=255&MSPPError=-2147217396#Anchor_2

Поместите полезные фрагменты кода ниже на тот случай, если ссылка в будущем отключится:

//Add a custom taskpane to active Word document
public void AddCalendarTaskPane(Word.Document doc)
{
    ctpCalendar = this.CustomTaskPanes.Add(new CalendarControl(),
        "Select a date", doc.ActiveWindow);
    ctpCalendar.Visible = true;
}

Вместо удаления я рекомендую скрыть панель задач, установив для флага Visible значение false, но YMMV. Надеюсь это поможет.

person Mr.Hunt    schedule 10.12.2015