Я добавил CustomTaskPane в Excel 2013, который позволяет пользователям быстро искать фотографии. Он работает хорошо и прекрасно, если пользователь открывает или создает одну книгу. Проблема в том, что если они открывают другую книгу или создают новую, панель задач не появляется в новом окне, которое появляется. Он просто остается в исходном окне. Я знаю, что это поведение вызвано тем, что я только инициализировал панель при открытии Excel. Я добавил обработчик событий в событие ActiveWindow для инициализации новой панели при открытии другой книги.
Проблема в том, что я не могу понять, как определить, уже ли CustomTaskPane уже присутствует в окне. Если это так, он просто создает другую CustomTaskPane, поэтому в этом окне есть два. Я написал следующий код, чтобы избавиться от оригинала и создать новый, но он вводит некоторое отставание (1-5 секунд), которое будет приводить пользователей в бешенство каждый раз, когда они меняют окна рабочей книги. Есть ли способ увидеть, что CustomTaskPane уже существует в окне, чтобы избежать утилизации и воссоздания нового, чтобы избежать стекирования дублированных панелей задач?
Microsoft.Office.Tools.CustomTaskPane PartPhotoTaskPane;
Globals.ThisAddIn.Application.WindowActivate += Application_WindowActivate;
void Application_WindowActivate(Excel.Workbook Wb, Excel.Window Wn)
{
if (PartPhotoTaskPane != null)
{
PartPhotoTaskPane.Dispose();
InitalizePartPhotoViewerTaskPane(EPPF);
}
else
{
InitalizePartPhotoViewerTaskPane(EPPF);
}
}
/// <summary>
/// Start up the part photo viewer task pane
/// </summary>
private void InitalizePartPhotoViewerTaskPane(ExcelPartPhotoFunctions _EPPF)
{
//intialize the part search
try
{
PartPhotoTaskPane = Globals.ThisAddIn.CustomTaskPanes.Add(new PartPhotoSearchPane(_EPPF), "Part Information", Globals.ThisAddIn.Application.ActiveWindow);
PartPhotoTaskPane.Visible = Properties.Settings.Default.InfoPaneOpenStatus;
PartPhotoTaskPane.Width = 260;
}
catch (Exception e)
{
MessageBox.Show("Error starting Part Info Toolbar:" + Environment.NewLine +
e.Message + Environment.NewLine + e.StackTrace, "Error!", MessageBoxButtons.OK,
MessageBoxIcon.Error);
}
}