打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Excel 2013单文档界面(SDI):如何重建任务窗格以支持它

发布于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中的方式类似,我有点难以理解。幸运的是,我的同事DmitryGennady提出了一个简单而又出色的想法!

首先,在项目中添加一个新的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属性设置TrueExcel 2013的最终结果应类似于以下内容:

在Excel 2013中浮动自定义任务窗格:

现在,我必须指出,这不是解决Excel 2013处理自定义任务窗格的方式的全部和最终目的,而只是一些思考的问题。如果您已经解决了类似的挑战或者想要使用Excel 2013来解决这个问题,请在下面的评论中分享。

谢谢你的阅读。直到下一次,继续编码!

可用下载:

此示例Outlook加载项是使用Office和.net的Add-in Express开发的

Excel 2013任务窗格(C#示例)

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
电脑做账:如何让Excel更轻松更好用
在excel任何工作簿中调用个人工作簿中的自定义函数
Office模板大动员 大大提高工作效率 - 中关村 - 四川在线天府论坛
Excel 2003 命令在 Excel 2007 中的位置
Excel Service能做什么和不能做什么
2012职称计算机考试Excel2003模块模拟测试试题和答案解析
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服