Excel VSTO Addin显示/隐藏任务窗格

我在这里做教程。 一切正常,一个空白的Excel页面

https://msdn.microsoft.com/en-us/library/bb608590(v=vs.120).aspx

当我加载一个Excel表格,有人给我,去点击toggleButton1来显示我得到的窗格

{“任务面板已被删除或不再有效。”}

在线上

private void toggleButton1_Click(object sender, RibbonControlEventArgs e) { Globals.ThisAddIn.TaskPane.Visible = ((RibbonToggleButton)sender).Checked; } 

指向该任务窗格的指针是否会消失?

 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); } } 

试验1:

仍然错误的点击事件。 我猜这是相关的东西需要分享类之间的窗格?

 private void toggleButton1_Click(object sender, RibbonControlEventArgs e) { Globals.ThisAddIn.TaskPane.Visible = ((RibbonToggleButton)sender).Checked; } private void ExcelEvents_WorkbookActivate(Excel.Workbook wb) { var taskPane = (customTaskPanes.Where(kvp => kvp.Key.Target == wb).Select(kvp => kvp.Value).FirstOrDefault()); if (taskPane == null) { UcCenlarInvest control = new UcCenlarInvest(); taskPane = this.CustomTaskPanes.Add(control, "My pane for workbook " + wb.Name); customTaskPanes[new WeakReference(wb)] = taskPane; } } 

试图2:

所以现在Ribbon类可以得到TaskPane但我仍然得到相同的错误。 添加了这个:

  private CustomTaskPane taskPane; public CustomTaskPane TaskPane { get { //return (customTaskPanes.Where(kvp => kvp.Key.Target == wb).Select(kvp => kvp.Value).FirstOrDefault()); return pane; } set { taskPane = value; } } 

…..

  TaskPane = (customTaskPanes.Where(kvp => kvp.Key.Target == wb).Select(kvp => kvp.Value).FirstOrDefault()); 

Excel 2016是一个单一的文档界面(SDI),Excel中的每个工作簿都包含自己的function区UI。 更多信息

如果您打开一个新的工作簿,将出现一个新的function区,但指向该任务窗格的指针将丢失。 您应该实施WorkbookActivate事件并添加一个新的任务窗格,如果没有任何窗格已经存在它。 你也应该保留一个指向自定义任务窗口的静态列表。

请参阅此解决scheme: Excel中的CustomTaskPane不会出现在新的工作簿中