发布于2013年2月28日星期四上午8:00,作者:Pieter van der Westhuizen。如果您是Excel的狂热用户,您会注意到Excel 2013已从多文档界面(MDI)应用程序转变为单文档界面(SDI)应用程序。 基本上这意味着一个Excel窗口包含一个Excel工作簿,而在过去,您可以在一个Excel窗口中打开多个Excel工作簿。 在图像的帮助下,这些东西总是更容易解释。下面是如何在Excel 2010中打开多个工作簿的示例。 在Excel 2010中打开多个工作簿: 而使用Excel 2013,您仍然可以平铺Excel工作簿,但每个工作簿将位于其自己的窗口中,并且每个工作簿都将具有自己的功能区。 在Excel 2013中打开多个工作簿: 此更改确实会对Excel加载项产生影响,因为所有工作簿级别事件,方法和属性现在都在顶级窗口中运行。 此更改如何影响您的自定义Excel任务窗格从最终用户的角度来看,这可能不是什么大问题,因为Word多年来一直使用单个文档界面。但是,从开发人员的角度来看,此更改确实会显着影响自定义任务窗格的可用性。 考虑上面的示例,但在Excel 2010中使用自定义任务窗格: 在Excel 2010中,我们的自定义任务窗格具有多个打开的工作簿,看起来很好,它很清楚它的作用,它适用于所有打开的工作簿。 但是,在Excel 2013中,相同的自定义任务窗格可能会非常混乱,如下图所示: 您会注意到,在Excel 2013中,每个工作簿现在都有自己的自定义任务窗格版本,并且根据任务窗格提供的功能类型,这种“外观”可能会让用户感到非常困惑。在我的示例中,任务窗格使用户能够在打开的工作簿之间复制工作表,而其目的在Excel 2010中非常明显,但在Excel 2013中则不然。 我们如何让自定义任务窗格在Excel 2013中正常工作?为了使我的自定义Excel 2013任务窗口的行为方式与Excel 2010中的方式类似,我有点难以理解。幸运的是,我的同事Dmitry和Gennady提出了一个简单而又出色的想法! 首先,在项目中添加一个新的Windows窗体。我们正在使用Office和.net的Add-in Express。 接下来,向项目添加新的用户控件。此控件将是我们任务窗格的主UI,通过使用用户控件,它将使我们能够在Windows窗体和Excel任务窗格上重用逻辑。 接下来,打开AddinModule设计器表面并将新的Microsoft Excel事件组件添加到设计器表面。 通过在Microsoft Excel事件组件的事件列表中双击它旁边的WindowResize事件添加新的事件处理程序。 将以下代码添加到事件处理程序: private void adxExcelEvents_WindowResize(object sender, object hostObj, object window){ Excel.Window currentWindow = null; try { currentWindow = (Excel.Window)window; if (taskPaneForm != null) { if (currentWindow.WindowState == Excel.XlWindowState.xlMinimized) { if (IsAllWindowsMinimized()) taskPaneForm.Hide(); } else { taskPaneForm.Show(); } } } finally { if (currentWindow != null) Marshal.ReleaseComObject(currentWindow); }} 该taskPaneForm是在AddinModule.cs类的顶部声明。切换回AddinModule设计器并将新的RibbonTab组件添加到设计器表面。 将功能区按钮添加到新功能区选项卡。此按钮将用于显示任务窗格或Windows窗体,具体取决于用户使用的Excel版本。 将以下代码添加到功能区按钮的OnClick事件: private void showTaskPaneRibbonButton_OnClick(object sender, IRibbonControl control, bool pressed){ if (this.HostMajorVersion > 14) { if (taskPaneForm == null) { taskPaneForm = new frmTaskPane(this.ExcelApp as Excel._Application); taskPaneForm.TopMost = true; } taskPaneForm.Show(); } else { AddTaskPane(); taskPaneItem.ShowTaskPane(); }} AddTaskPane方法的代码类似于以下内容: private void AddTaskPane(){ if (adxExcelTaskPanesManager1.Items.Count > 0) return; taskPaneItem = new AddinExpress.XL.ADXExcelTaskPanesCollectionItem(); taskPaneItem.TaskPaneClassName = "ExcelSDI.ADXExcelTaskPane1"; taskPaneItem.AlwaysShowHeader = true; taskPaneItem.UseOfficeThemeForBackground = true; taskPaneItem.CloseButton = true; taskPaneItem.Position = AddinExpress.XL.ADXExcelTaskPanePosition.Left; adxExcelTaskPanesManager1.Items.Add(taskPaneItem);} 我们现在准备构建,注册和运行我们的加载项。您会注意到自定义任务窗格将在2013之前的任何Excel版本中按预期工作。如果用户使用Excel 2013,我们之前添加的Windows窗体将显示任务窗格的内容作为浮动窗口。窗口将始终位于任何其他窗口的顶部,因为我们已将其TopMost属性设置为True。Excel 2013的最终结果应类似于以下内容: 在Excel 2013中浮动自定义任务窗格: 现在,我必须指出,这不是解决Excel 2013处理自定义任务窗格的方式的全部和最终目的,而只是一些思考的问题。如果您已经解决了类似的挑战或者想要使用Excel 2013来解决这个问题,请在下面的评论中分享。 谢谢你的阅读。直到下一次,继续编码! 可用下载:此示例Outlook加载项是使用Office和.net的Add-in Express开发的: |
|