分享

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

 yuxinrong 2019-08-09

发布于2013年2月28日星期四上午8:00,作者:Pieter van der Westhuizen


如果您是Excel的狂热用户,您会注意到Excel 2013已从多文档界面(MDI)应用程序转变为单文档界面(SDI)应用程序。

基本上这意味着一个Excel窗口包含一个Excel工作簿,而在过去,您可以在一个Excel窗口中打开多个Excel工作簿。

在图像的帮助下,这些东西总是更容易解释。下面是如何在Excel 2010中打开多个工作簿的示例。

在Excel 2010中打开多个工作簿

在Excel 2010中打开多个工作簿

而使用Excel 2013,您仍然可以平铺Excel工作簿,但每个工作簿将位于其自己的窗口中,并且每个工作簿都将具有自己的功能区。

在Excel 2013中打开多个工作簿

Excel 2013中打开了多个工作簿,每个工作簿都有自己的功能区

此更改确实会对Excel加载项产生影响,因为所有工作簿级别事件,方法和属性现在都在顶级窗口中运行。

此更改如何影响您的自定义Excel任务窗格

从最终用户的角度来看,这可能不是什么大问题,因为Word多年来一直使用单个文档界面。但是,从开发人员的角度来看,此更改确实会显着影响自定义任务窗格的可用性。

考虑上面的示例,但在Excel 2010中使用自定义任务窗格:

Excel 2010中的自定义任务窗格

在Excel 2010中,我们的自定义任务窗格具有多个打开的工作簿,看起来很好,它很清楚它的作用,它适用于所有打开的工作簿。

但是,在Excel 2013中,相同的自定义任务窗格可能会非常混乱,如下图所示:

Excel 2013中的自定义任务窗格

您会注意到,在Excel 2013中,每个工作簿现在都有自己的自定义任务窗格版本,并且根据任务窗格提供的功能类型,这种“外观”可能会让用户感到非常困惑。在我的示例中,任务窗格使用户能够在打开的工作簿之间复制工作表,而其目的在Excel 2010中非常明显,但在Excel 2013中则不然。

我们如何让自定义任务窗格在Excel 2013中正常工作?

为了使我的自定义Excel 2013任务窗口的行为方式与Excel 2010中的方式类似,我有点难以理解。幸运的是,我的同事DmitryGennady提出了一个简单而又出色的想法!

首先,在项目中添加一个新的Windows窗体我们正在使用Office和.net的Add-in Express

将新的Windows窗体添加到COM加载项项目

接下来,向项目添加新的用户控件此控件将是我们任务窗格的主UI,通过使用用户控件,它将使我们能够在Windows窗体和Excel任务窗格上重用逻辑。

向项目添加新的用户控件

接下来,打开AddinModule设计器表面并将新的Microsoft Excel事件组件添加到设计器表面。

将新的Excel事件组件添加到设计器表面

通过在Microsoft Excel事件组件的事件列表中双击它旁边WindowResize事件添加新的事件处理程序

为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处理自定义任务窗格的方式的全部和最终目的,而只是一些思考的问题。如果您已经解决了类似的挑战或者想要使用Excel 2013来解决这个问题,请在下面的评论中分享。

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

可用下载:

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

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

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多